2010-07-22 24 views
0

在類似下面的代碼,我們通常有2個字節的結構的末尾隱式墊:聚合初始值與隱結構填充

struct foo { 
    int32_t x ; 
    int16_t y ; 
// <<< 2 bytes for total sizeof(foo) == 8 
} ; 

有人問我今天的聚合初始值不與額外的兩個字節:

foo o = { 0, 0 } ; 

即:這是怎麼回事等同於

foo o ; 
memset(&o, 0, sizeof(foo)) ; 

我沒有線索,所以我建議不要依賴那個(總之,問題總是很麻煩,所以這是很好的一般建議IMO)。

有沒有人知道C語言規範是否說明了當平臺ABI需要對特定結構有問題的填充時,隱式填充的集合初始化會做什麼?

+1

奇怪,只是一個思想實驗,或這會影響一個項目?我會假設它沒有填充它,儘管在你的編譯器中可能有一些'#pragma pack'版本去除填充並使其等價於... – eruciform 2010-07-22 18:23:33

回答

2

從C99標準引用「的類型的表示法」,6.2.6:

當值被存儲在 結構或聯合類型的對象,包括在 一個成員對象時,字節的 對象表示形式,對應於 到任何填充字節取未指定的 值。

總之,它不是由語言指定的;這取決於C編譯器/接口實現者。

0

我相當確定沒有關於填充初始化的要求。舉個例子,對於一個實現來說,每結構中添加填充到結構是完全合法的,並且它會存儲一個標籤,告訴它支持運行時類型檢查的結構是什麼類型。在這種情況下,大多數結構將包含始終非零的填充。