struct字节对齐方式...更新中

一:

#pragma pack (n)  //编译器将按照n个字节对齐
#pragma pack ()   //取消自定义字节对齐方式
 
#pragma pack (2) /*指定按2字节对齐*/
struct G{
   char b;
   int a;
   double d;
   short c;
};
#pragma pack () /*取消指定对齐,恢复缺省对齐*/
在结构体G中成员变量的最大对齐模数是sizeof(double)=8;又因为指定对齐模数是2;所以取其较小者2为结构体G的最大对齐模数;则sizeof(G)=2+4+8+2=16;由于16是2的整数倍,则不需要填充。
注意:如果#pragma pack (n)中指定的n大于结构体中最大成员的size,则其不起作用,结构体仍然按照size最大的成员进行对界。
二:

union u
{
 double a;
 int b;
};
union u2
{
 char a[13];
 int b;
};
union u3
{
 char a[13];
 char b;
};

都知道union的大小取决于它所有的成员中,占用空间最大的一个成员的大小。所以对于u来说,
大小就是最大的double类型成员a了,所以sizeof(u)=sizeof(double)=8。但是对于u2和u3,最
大的空间都是char[13]类型的数组,为什么u3的大小是13,而u2是16呢?关键在于u2中的成员
int b。由于int类型成员的存在,使u2的对齐方式变成4,也就是说,u2的大小必须在4的对界
上,所以占用的空间变成了16(最接近13的对界)。

三:

猜你喜欢

转载自www.cnblogs.com/tianzeng/p/9038395.html
今日推荐