2015-09-15 73 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位。除此之外,編譯器可以(或不可以)在元素之間添加一些填充,有時取決於元素類型,有時不會。

結論:如果你寫的是取決於指針運算喜歡你提出的一個代碼,你的代碼將平臺相關執行/編譯器相關的