您的位置:首页 > 其它

字节对齐#pragma pack()

2015-07-22 12:48 197 查看

为什么要进行对齐

对于结构体,编译器会自动进行成员变量对齐处理,是为了提高运算效率。

缺省情况下是自然对齐方式。

自然对齐

即默认对齐,按照结构体的成员中size最大的成员进行对齐。

例:

struct naturalalign
{
char a;
short b
int c;
};


上述结构体,成员size最大的是c,sizeof(c)为4,因此,结构体中的成员都以4为单位进行对齐,sizeof(naturalalign)为12.

指定对齐

即按照指定的字节大小进行对齐。

使用伪指令:

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

Intel、微软面试题

#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.
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: