(C)字節對齊#pragma pack()

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.

發佈了27 篇原創文章 · 獲贊 19 · 訪問量 7萬+
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章