2012-09-09 63 views
2

可能重複:
Why isn't sizeof for a struct equal to the sum of sizeof of each member?C中struct mem如何?

我無法理解結構MEM頁頭。

typedef struct a{ 
} a; 

sizeof(a) is 0 

typedef struct b{ 
    int bb 
} b; 

sizeof(b) is 4 

typedef struct b2{ 
    int *bbbb 
} b2; 

sizeof(b2) is 8 

typedef struct d{ 
    int x; 
    int *y; 
} d; 

sizeof(d) is 16! 

爲什麼sizeof是16?是12?(int + int point = 4 + 8);

我估計sizeof(int)是4,如果int var在struct中,mem是8?

+1

http://stackoverflow.com/questions/119123/why-isnt-sizeof-for-a-struct-equal-to-the-sum-of-sizeof-of-each-member –

回答

4

爲什麼sizeof是16?是12?(int + int point = 4 + 8);

由於指針在您的機器上的寬度爲8個字節,因此出於性能原因,編譯器覺得有必要將它與8字節邊界對齊。在某些體系結構中,它甚至可能不是嚴格的性能問題:對某些類型的未對齊訪問可能是非法的。

換句話說,編譯器允許在所有地方添加填充,,除了在結構的第一個元素之前。

+0

我明白了!then struct必須是8byte的倍數? – SamPeng

+0

謝謝你的回答。我明白你的意思。這是機器相關的。 – SamPeng

+0

@SamPeng它也可以是編譯器相關的。 – cnicutar

1

根據您的平臺,sizeof(int *)可能是4或8(或其他)。另外,如果需要,編譯器可以自由地將未使用的填充字節添加到結構中。

0

這是由於填充和內存對齊。進一步的解釋請參考this link

0

內存校準正在進行中。事情需要一致。