如果我有這樣的結構:結構成員的內存佈局
struct S {
ANY_TYPE a;
ANY_TYPE b;
ANY_TYPE c;
} s;
我可以安全地假定了以下假設永遠是真實的在所有平臺上?
((char *)&s.a) < ((char *)&s.c)
((char *)&s.a + sizeof(s.a) + sizeof(s.b)) <= ((char *)&s.c)
在C++呢?
如果我有這樣的結構:結構成員的內存佈局
struct S {
ANY_TYPE a;
ANY_TYPE b;
ANY_TYPE c;
} s;
我可以安全地假定了以下假設永遠是真實的在所有平臺上?
((char *)&s.a) < ((char *)&s.c)
((char *)&s.a + sizeof(s.a) + sizeof(s.b)) <= ((char *)&s.c)
在C++呢?
是的,至少在C中。編譯器可以在任何結構成員之後自由插入填充,但不能對成員重新排序。
它也不能在第一個成員之前插入填充。
從C99,6.7.2.1
:
13/內的結構對象,非位字段構件和單元,其中位字段駐留有,在順序增加地址在其中它們被宣佈。指向適當轉換的結構對象的指針指向其初始成員(或者如果該成員是位域,則指向它所在的單位),反之亦然。結構對象中可能有未命名的填充,但不在其開頭。
15/在結構或聯合的末尾可能有未命名的填充。
在C++中,您可以確定這些假設是成立的。在像這樣的結構中,編譯器不允許改變成員的順序。
是的,默認情況下,C++編譯器不允許在結構中移動元素,這使得這兩個語句不重複。
是(只要的sizeof(ANY_TYPE)不爲0。一些編譯器允許的話,它是非標準的 - 見Can sizeof return 0 (zero))。你可以安全地使用< =或者只是假設一個標準的編譯器。
是
而在C++了。
指針比較只在數組和結構體/類中有意義,通常不是。
這對結構是正確的,但只要引入訪問說明符,就會在C++中進行更改。允許編譯器對由訪問說明符分隔的整個塊重新排序。
@VJo:你能解釋一下嗎? – 2011-10-17 12:40:08
ANY_TYPE不成立的例子是什麼? – 2011-10-17 12:40:29
你爲什麼想要?結構的要點是消除這種雜耍。 – Beta 2011-10-17 12:45:21