(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.

posted @ 2015-07-22 12:48  跑马灯的忧伤  阅读(226)  评论(0编辑  收藏  举报