2015-09-15 50 views
1

据我所知,类和结构的数据被放置一个可变接连,例如:类和结构数据放置C/C++

class Foo 
{ 
    int A; 
    char B; 
    float* C; 
    double* D; 
}; 

Foo Object; 
char* ptr = &Object; 

&(Object.A) == ptr; // all these are true 
&(Object.B) == ptr+sizeof(int); 
&(Object.C) == ptr+sizeof(int)+sizeof(char); 
&(Object.D) == ptr+sizeof(int)+sizeof(char)+sizeof(float*); 

是否总是工作方式?如果我在课堂上使所有这些数据都是静态的,它也会起作用吗?

+2

对'void *'的指针运算?嗯... –

+5

“它总是这样工作吗?” **没有**。 –

+0

非常感谢。这就是我想知道的,如果这是某种标准或者它有时会发生。 – Avert

回答

1

好吧,评论有点误导,虽然都是正确的。 (也许因为这实际上是duplicate of an old question

你原来的假设是“基本上”是正确的。那么,基本上

您唯一可以(至少大部分时间)依赖的是订单的元素。

不同平台和编译器的实际元素大小差异很大。这本身就是一个问题,但大部分时间是32位,但有时是16位甚至64位。除此之外,编译器可以(或不可以)在元素之间添加一些填充,有时取决于元素类型,有时不会。

结论:如果你写的是取决于指针运算喜欢你提出的一个代码,你的代码将平台相关执行/编译器相关的