1. 爲什麼要進行對齊
對於結構體,編譯器會自動進行成員變量對齊處理,是爲了提高運算效率。
缺省情況下是自然對齊方式。
2. 自然對齊
即默認對齊,按照結構體的成員中size最大的成員進行對齊。
例:
struct naturalalign
{
char a;
short b
int c;
};
上述結構體,成員size最大的是c,sizeof(c)爲4,因此,結構體中的成員都以4爲單位進行對齊,sizeof(naturalalign)爲12.
3. 指定對齊
即按照指定的字節大小進行對齊。
使用僞指令:
#pragma pack(N); //按照N個字節進行對齊
#pragma pack();//取消指定對齊
注:
如果N大於結構體中最大成員的size,則不起作用。仍然以默認方式對齊。
例:
#pragma pack(N)
struct natural
{
char a;
int b;
char c;
};
#pragma pack();
當N分別爲4,8,16時,其對齊方式是一樣的。sizeof(natural)都爲12;
當N爲2時,sizeof(natural)爲6.
4. Intel1.微軟面試題
#pragma pack(8)
struct example1
{
short a;
long b;
};
struct example2
{
char c;
example1 struct1;
short e;
};
#pragma pack();
int main(int argc,char*argv[])
{
example2 struct2;
cout<<sizeof(example1)<<endl;
cout<<sizeof(example2)<<endl;
cout<<(unsigned int)(&struct2.struct1) - (unsigned int)(&struct2)<<endl;
return 0;
}
問:程序輸出結果?
分析:
struct example1中成員最大size爲4,故指定對齊8不起作用。
sizeof(example1) = 4*2 = 8;
struct example2中包含struct example1,其本身成員最大size爲2,而example1中的成員最大size爲4,指定對齊8也不起作用。,
sizeof ( example2 ) = 4*4 = 16;
由於struct example2中成員以4爲單位對界,因此,char變量c後應該補充3個bit,後面纔是struct1的地址,故最後輸出結果爲4.