由一道面試題來看
Struct
的對界
?
本文節選自宋寶華的C/C++的struct深層探索一文,本人對其所描述的struct對齊比較喜歡,為此轉來與大家分享,原文見http://blog.donews.com/21cnbao/archive/2005/09/08/544877.aspx
?
Intel
、微軟等公司曾經出過一道類似的面試題:
1. #include <iostream.h>
2. #pragma pack(8)
3. struct example1
4. {
5. ? ??short a;
6. ? ??long b;
7. };
8. struct example2
9. {
10. ?????? ??char c;
11. ?????? ??example1 struct1;
12. ?????? ??short e;
13. };
14. #pragma pack()
?
15. int main(int argc, char* argv[])
16. {
17. ?????? ??example2 struct2;
18. ??cout << sizeof(example1) << endl;
19. ??cout << sizeof(example2) << endl;
20. ??cout << (unsigned int)(&struct2.struct1) - (unsigned int)(&struct2)
<< endl;
21. return 0;
22. }
問程序的輸入結果是什么?
答案是:
8
16
4
不明白?還是不明白?下面一一道來:
1
、
自然對界
struct
是一種復合數據類型,其構成元素既可以是基本數據類型(如
int
、
long
、
float
等)的變量,也可以是一些復合數據類型(如
array
、
struct
、
union
等)的數據單元。對于結構體,編譯器會自動進行成員變量的對齊,以提高運算效率。缺省情況下,編譯器為結構體的每個成員按其自然對界(
natural alignment
)條件分配空間。各個成員按照它們被聲明的順序在內存中順序存儲,第一個成員的地址和整個結構的地址相同。
自然對界
(natural alignment)
即默認對齊方式,是指按結構體的成員中
size
最大的成員對齊。
例如:
struct naturalalign
{
char a;
short b;
char c;
};
在上述結構體中,
size
最大的是
short
,其長度為
2
字節,因而結構體中的
char
成員
a
、
c
都以
2
為單位對齊,
sizeof(naturalalign)
的結果等于
6
;
如果改為:
struct naturalalign
{
char a;
int b;
char c;
};
其結果顯然為
12
。
?
2
、
指定對界
一般地,可以通過下面的方法來改變缺省的對界條件:
·
使用偽指令
#pragma pack (n)
,編譯器將按照
n
個字節對齊;
·
使用偽指令
#pragma pack ()
,取消自定義字節對齊方式。
注意:如果
#pragma pack (n)
中指定的
n
大于結構體中最大成員的
size
,則其不起作用,結構體仍然按照
size
最大的成員進行對界。
例如:
#pragma pack (n)
struct naturalalign
{
char a;
int b;
char c;
};
#pragma pack ()
當
n
為
4
、
8
、
16
時,其對齊方式均一樣,
sizeof(naturalalign)
的結果都等于
12
。而當
n
為
2
時,其發揮了作用,使得
sizeof(naturalalign)
的結果為
8
。