Chinaunix首页 | 论坛 | 博客
  • 博客访问: 35000
  • 博文数量: 7
  • 博客积分: 129
  • 博客等级: 入伍新兵
  • 技术积分: 60
  • 用 户 组: 普通用户
  • 注册时间: 2012-08-15 20:44
文章分类
文章存档

2012年(7)

我的朋友
最近访客

分类: LINUX

2012-10-13 10:39:37

 
 struct 结构大小和顺序、#progma pack参数有关系,针对字节对齐,环境使用的gcc version 3.2.2编译器(32x86平台)为例。
 
char 长度为1个字节,short 长度为2个字节,int 长度为4个字节。

       struct 子项在内存中的按顺序排列,在没有#progma pack(n)参数的情况,各个子项的对齐系数为自己长度;在有#progma pack(n)参数的情况,各子项的对齐系数为min(自己长度,n)。struct 整体的对齐系数为子项对齐系数最大值。

 

看下面的例题:

 

例题一:

 

struct A{

char a; //字长1,对齐系数1

char b; //字长1,对齐系数1

char c; //字长1,对齐系数1

};//整体对齐系数为1

sizeof(struct A)值是

 

看下图

绿色为被填充的内存,黄色为空

因此sizeof(struct A)=3;

 

例题二:

 

struct B {

int a; //对齐系数4

char b; //对齐系数1

short c; //对齐系数2

};//整体对齐系数4

sizeof(strcut B)值是

如图

short c对齐系数2必须和偶地址对其,int a同理也与能4的倍数地址对齐。

粉色内存被结构占用

因此sizeof(strcut B)=8

 

例题三:

 

struct C {

char b; //对齐系数1

int a; //对齐系数4

short c; //对齐系数2

};//整体对齐系数4

sizeof(struct C)的值是

 

如图

int a 从4的倍数地址开始,所以开始地址是4,因为结构整体对齐系数为4,因此short c后的两个内存被占用,使大小为4的倍数。

sizeof(struct C)=12

 

例题四:

 

#progma pack (2)

struct D {

char b; //对齐系数min(长度=1,n=2)=1

int a; //对齐系数min(长度=4,n=2)=2

short c; //对齐系数min(长度=2,n=2)=2

};//整体对齐系数2

sizeof(struct D)值是

如图

#progma pack (2) 对int a的放置产生影响,

#progma pack (n) 只能取1、2、4

因此 sizeof(struct D)=8

 

 

 

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

czqwust2012-12-20 15:50:28

不错,学习了!