2011-09-22 72 views
0

假定這樣定義一個結構:混淆數據對準

struct S{ 
    char a[3]; 
    char b[3]; 
    char c[3]; 
}; 

然後將是什麼的printf的輸出( 「%d」,的sizeof(S))?在我的VC++ 2008表達式編譯器中,輸出爲9.我感到困惑......我想結果是12,但事實並非如此。編譯器不應該將結構與4或8對齊嗎?

+0

您希望看到除9之外的任何內容的原因是什麼? – NPE

回答

4

sizeof-expression的值取決於實現;由C++標準保證唯一的事情是它必須至少有9個,因爲你在struct中存儲了9個char

新的C++ 11標準有一個alignas關鍵字,但這可能不會在VC++ 08中實現。檢查您的編譯器手冊(請參閱,例如__declspec(align(#)))。

1

每個成員對齊的典型要求只要求結構本身對齊到最大的成員類型。由於所有成員類型爲char,對齊方式爲1,所以不需要填充。 (對於數組,基類型(所有擴展區被移除)是重要的。)

考慮製作一個結構數組:你需要所有該數組的所有元素的成員要對齊。但在你的情況下,這只是一大堆字符,所以不需要填充。

舉一個例子,假設你的平臺sizeof(short) == 2和那個對齊大小相等,並且考慮struct X { char a; short b; char c; };。然後在ab之間有一個字節的內部填充,以便正確對齊b,而且在c之後還有一個字節的終端填充,以便整個結構的大小是最大成員大小2的倍數。這樣,當您有一個數組X arr[10]時,arr的所有元素都將分別正確對齊。

2

S中沒有任何內容會強制任何成員對齊,而不是每個字節,所以編譯器根本不需要添加任何填充。

1

首先,對齊是依賴於實現的,所以它將取決於編譯器。

現在請記住,對於靜態分配的數組,大小不需要存儲(標準不需要它),因此數組的對齊通常是其元素的對齊。

這裏,char[3]因此具有1的對齊,並且它們是完美包裝的。

0

編譯器在數據對齊方面給予了相當寬的範圍。然而,實際上,數據的對齊不會超過其大小。也就是說,char必須是字節對齊的,而intlong通常是四字節對齊的。

此外,struct s符合其成員最嚴格的對齊要求。

因此,在您的示例中,最嚴格的內部對齊要求是1個字節對齊,所以結構是1個字節對齊。這意味着它不需要填充。