字节对齐问题

考试站(www.examzz.com)   【考试站:中国教育考试第一门户】   2013年8月14日

  规则:

  1 、数据成员对齐规则:结构 (struct)( 或联合 (union)) 的数据成员,第一个数据成员放在 offset 为 0 的地方,以后每个数据成员的对齐按照 #pragma pack 指定的数值和这个数据成员自身长度中,比较小的那个进行。

  2 、结构 ( 或联合 ) 的整体对齐规则:在数据成员完成各自对齐之后,结构 ( 或联合 ) 本身也要进行对齐,对齐将按照 #pragma pack 指定的数值和结构 ( 或联合 ) 最大数据成员长度中,比较小的那个进行。

  3 、结合 1 、 2 可推断:当 #pragma pack 的 n 值等于或超过所有数据成员长度的时候,这个 n 值的大小将不产生任何效果。 使用指令#pragma pack (n),编译器将按照 n个字节对齐。使用指令#pragma pack (),编译器将取消自定义字节对齐方式。在#pragma pack (n)和#pragma pack ()之间的代码按 n个字节对齐。

  struct s1

  {

  int a;

  char b;

  short e;

  int c;

  };

  struct s2

  {

  int a;

  char b;

  int c;

  short e;

  int d;

  };

  1字节对齐 为 11 和 15

  2字节对齐 为 11 和 16

  4字节对齐 为 12 和 20

  8字节对齐 为 12 和 20

  16字节对齐 为 12 和 20

 看如下例子:

  #pragma pack(8)

  struct TestStruct4

  {

  char a;

  long b;

  };

  struct TestStruct5

  {

  char c;

  TestStruct4 d;

  long long e;

  };

  #pragma pack()

  问题:

  A) sizeof(TestStruct5)=?

  B) TestStruct5的 c 后面空了几个字节接着是 d ?

  TestStruct4中,成员 a 是 1字节,默认按 1字节对齐,指定对齐参数为 8,这两个值中取 1,a 按 1字节对齐;成员 b 是 4个字节,默认是按 4字节对齐,这时就按 4字节对齐,所以sizeof(TestStruct4)应该为 8。

  TestStruct5 中,c 和 TestStruct4 中的 a 一样,按 1字节对齐,而 d 是个结构,它是 8个字节,它按什么对齐呢?对于结构来说,它的默认对齐方式就是它的所有成员使用的对齐参数中最大的一个, TestStruct4的就是 4。所以,成员 d 就是按 4字节对齐。成员 e 是 8个字节,它是默认按 8字节对齐,和指定的一样,以它对到 8字节的边界上。这时,已经使用了12个字节了,所以又添加了 4个字节的空,从第 16个字节开始放置成员 e。这时,长度为24,已经可以被 8(成员 e 按 8字节对齐)整除。这样,一共使用了 24个字节。内存布局如下(*表示空闲内存,1表示使用内存,单位为 1byete) :

首页 1 2 尾页

相关文章