Chinaunix首页 | 论坛 | 博客
  • 博客访问: 161855
  • 博文数量: 76
  • 博客积分: 1513
  • 博客等级: 上尉
  • 技术积分: 755
  • 用 户 组: 普通用户
  • 注册时间: 2011-11-25 15:15
文章分类

全部博文(76)

文章存档

2012年(2)

2011年(74)

我的朋友

分类: C/C++

2011-11-25 19:46:43

C语言结构体对齐问题详解

 

1 结构体数据对齐(没有#pragma pack()宏定义)

结构体对齐可以总结为三个基本原则

数据成员对齐规则:

结构体的数据成员中,第一个成员从offset为0的地址开始,以后每一个成员存储的起始位置为该成员大小的整数倍(在win32中int为32bit也即4字节对齐)

结构体作为成员:

如果一个结构体1作为另一个结构体2的数据成员,则在结构体2中结构体1要从1内部成员最大的整数倍地址开始存储。

结构体的总大小(sizeof)

为该结构体内部最大基本类型的整数倍,不足的要补齐,而不是简单的所有成员的大小总和。(收尾工作!!)

举例说明

  1. struct{

  2. short a;

  3. short b;

  4. short c; }A;

sizeof(A) = 6;(vc6与gcc相同)

  1. struct{

  2. long a;

  3. short c; }A;

sizeof(A) = 8;(vc6与gcc相同),根据原则③

它的内存分配为: a1 a2 a3 a4 , c1 c2 x x(a1为a的第一个字节,x为补齐字节,下同)

  1. struct{

  2. int a;

  3. char b;

  4. short c; }A;

sizeof(A) = 8;

A的内存分配为: a1 a2 a3 a4, b1 x c1 c2(原则1)

  1. struct{

  2. char a;

  3. int b;

  4. short c; }A1;

sizeof(A1) = 12; (vc6与gcc相同)

A1的内存分配为: a1 x x x, b1 b2 b3 b4, c1 c2 x x

下面是更复杂的情况,结构体作为成员

  1. struct{

  2. int a;

  3. doubl b;

  4. short c; }A; // sizeof(A) = 24 (vc6与gcc相同)

  5. struct{

  6.     char a,b;

  7. int c;

  8. double d;

  9. short e;

  10. struct A h;

  11. }B;

  12. sizeof(B) = 48 //(vc6与gcc相同)

A的内存分布: a1 a2 a3 a4 x x x x, b1 b2 b3 b4 b5 b6 b7 b7, c1 c2 x x x x x x

B的内存分布:a1 b1 x x, c1 c2 c3 c4 , d1 d2 d3 d4 d5 d6 d7 d8, e1 e2 x x x x, A的分布

 

 

2 加入#pragma pack()宏定义)

#pragma pack(1)

上面的AB大小分别为14,30,对应于AB的内存分布,去掉x。

pack(2)时为14,30

pack(4)时为16,36

阅读(513) | 评论(0) | 转发(0) |
给主人留下些什么吧!~~