2011-10-17 65 views
5

如果我有這樣的結構:結構成員的內存佈局

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++呢?

+0

@VJo:你能解釋一下嗎? – 2011-10-17 12:40:08

+0

ANY_TYPE不成立的例子是什麼? – 2011-10-17 12:40:29

+0

你爲什麼想要?結構的要點是消除這種雜耍。 – Beta 2011-10-17 12:45:21

回答

3

是的,至少在C中。編譯器可以在任何結構成員之後自由插入填充,但不能對成員重新排序。

它也不能在第一個成員之前插入填充。

從C99,6.7.2.1

13/內的結構對象,非位字段構件和單元,其中位字段駐留有,在順序增加地址在其中它們被宣佈。指向適當轉換的結構對象的指針指向其初始成員(或者如果該成員是位域,則指向它所在的單位),反之亦然。結構對象中可能有未命名的填充,但不在其開頭。

15/在結構或聯合的末尾可能有未命名的填充。

1

在C++中,您可以確定這些假設是成立的。在像這樣的結構中,編譯器不允許改變成員的順序。

0

是的,默認情況下,C++編譯器不允許在結構中移動元素,這使得這兩個語句不重複。

0
  1. 是(只要的sizeof(ANY_TYPE)不爲0。一些編譯器允許的話,它是非標準的 - 見Can sizeof return 0 (zero))。你可以安全地使用< =或者只是假設一個標準的編譯器。

而在C++了。

指針比較只在數組和結構體/類中有意義,通常不是。

4

這對結構是正確的,但只要引入訪問說明符,就會在C++中進行更改。允許編譯器對由訪問說明符分隔的整個塊重新排序。