Chinaunix首页 | 论坛 | 博客
  • 博客访问: 1736736
  • 博文数量: 206
  • 博客积分: 1450
  • 博客等级: 上尉
  • 技术积分: 2285
  • 用 户 组: 普通用户
  • 注册时间: 2008-09-11 11:38
个人简介

学习永无止境!!

文章分类

全部博文(206)

文章存档

2022年(5)

2019年(3)

2018年(8)

2017年(32)

2016年(7)

2015年(13)

2014年(44)

2013年(24)

2011年(6)

2010年(17)

2009年(46)

2008年(1)

分类: LINUX

2009-10-19 15:25:22

默认情况下,在32位cpu里,gcc对于结构体的对齐方式是按照四个字节来对齐的。看以下结构体

typedef struct pack{
char a;
int b;
short c;
}pack;

对于Pack结构体,默认情况下在arm/386平台下(别的平台没试过)sizeof(pack)=12,求解过程如下:

sizeof(char)=1;

下一个int b,由于是四个字节,要求b的开始地址从32的整数倍开始,故需要在a后面填充3个没用的字节,记为dump(3),sizeof(b)=4,此时相当于结构体扩充为

char a;
char dump(3);
int b;

看short c,现在c的前面有8个字节,c是两个字节,c的开始地址是从16的整数开始,在b前面不需再加东西.此时对于结构体来说,sizeof(pack)=10,但是这不是最终结果,最后总的字节数也要能被4个字节整除,所以还需在short c后面再加

dump(2);

故总的字节数为12.

当然以上说的只是简单的情况,下面谈谈Arm,x86在gcc里关于内存边界字节对齐的区别.对于同样的结构体,在386下

#prama pack(1)

后,sizeof(pack)=1 4 2=7

而在arm下同样的操作sizeof(pack)=1 4 2 1=8,即虽然b根a之间不要填充但总的长度必须要是4的整数倍.

在ARM 下要使结构体按指定字节对齐,可行的方法

1.在makefile里加-fpack-struct 选项,这样的话对所有的结构按一字节对齐.

不得不说,确实有那么些质量较差的程序可能需要你部分自然对齐,部分一字 节对齐,此时

2. typedef struct pack{

}__attribute__((packed))

可利用__attribute__属性

当然最后的方式,还是自己去看ARM体系结构与gcc编译选项了。

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