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

Posted ctz

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了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的对界)。

三:

以上是关于struct字节对齐方式...更新中的主要内容,如果未能解决你的问题,请参考以下文章

VS中代码对齐等快捷键

如何通过单击适配器类中代码的项目中的删除按钮来删除列表视图中的项目后重新加载片段?

字节对齐-------结构体共用体

Visual Studio2008 C++结构体成员需要内存对齐吗?

Struct 和 Union区别

VS2010中代码自动对齐的快捷键是啥?以前是Alt+F8就有用的,可是现在不行了。