假定這樣定義一個結構:混淆數據對準
struct S{
char a[3];
char b[3];
char c[3];
};
然後將是什麼的printf的輸出( 「%d」,的sizeof(S))?在我的VC++ 2008表達式編譯器中,輸出爲9.我感到困惑......我想結果是12,但事實並非如此。編譯器不應該將結構與4或8對齊嗎?
假定這樣定義一個結構:混淆數據對準
struct S{
char a[3];
char b[3];
char c[3];
};
然後將是什麼的printf的輸出( 「%d」,的sizeof(S))?在我的VC++ 2008表達式編譯器中,輸出爲9.我感到困惑......我想結果是12,但事實並非如此。編譯器不應該將結構與4或8對齊嗎?
sizeof
-expression的值取決於實現;由C++標準保證唯一的事情是它必須至少有9個,因爲你在struct
中存儲了9個char
。
新的C++ 11標準有一個alignas
關鍵字,但這可能不會在VC++ 08中實現。檢查您的編譯器手冊(請參閱,例如__declspec(align(#))
)。
每個成員對齊的典型要求只要求結構本身對齊到最大的成員類型。由於所有成員類型爲char
,對齊方式爲1
,所以不需要填充。 (對於數組,基類型(所有擴展區被移除)是重要的。)
考慮製作一個結構數組:你需要所有該數組的所有元素的成員要對齊。但在你的情況下,這只是一大堆字符,所以不需要填充。
舉一個例子,假設你的平臺sizeof(short) == 2
和那個對齊大小相等,並且考慮struct X { char a; short b; char c; };
。然後在a
和b
之間有一個字節的內部填充,以便正確對齊b
,而且在c
之後還有一個字節的終端填充,以便整個結構的大小是最大成員大小2
的倍數。這樣,當您有一個數組X arr[10]
時,arr
的所有元素都將分別正確對齊。
S
中沒有任何內容會強制任何成員對齊,而不是每個字節,所以編譯器根本不需要添加任何填充。
首先,對齊是依賴於實現的,所以它將取決於編譯器。
現在請記住,對於靜態分配的數組,大小不需要存儲(標準不需要它),因此數組的對齊通常是其元素的對齊。
這裏,char[3]
因此具有1
的對齊,並且它們是完美包裝的。
編譯器在數據對齊方面給予了相當寬的範圍。然而,實際上,數據的對齊不會超過其大小。也就是說,char
必須是字節對齊的,而int
和long
通常是四字節對齊的。
此外,struct
s符合其成員最嚴格的對齊要求。
因此,在您的示例中,最嚴格的內部對齊要求是1個字節對齊,所以結構是1個字節對齊。這意味着它不需要填充。
有一個編譯器開關/ Zp,允許您設置默認的結構成員對齊方式。還有一些用c語言指定對齊的方法。
看看這個MSDN職位的詳細信息:
http://msdn.microsoft.com/en-us/library/xh3e3fd0(v=vs.80).aspx
也許你的編譯器使用這些設置嗎?
您希望看到除9之外的任何內容的原因是什麼? – NPE