[B原创] Arm/x86结构体gcc内存边界对齐问题
2006-02-21 17:39
302 查看
这段时间移植公司的linux+i386程序到Arm+linux平台,本以为是件工作量很小的事情,以为只要改几个驱动程序就OK了,没想到在应用程序这一块卡了很长时间。其中最烦的事情就莫过于结构体内存边界对齐了。搞了这么久,终于终结了一些小经验。
默认情况下,在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编译选项了。
默认情况下,在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编译选项了。
相关文章推荐
- Arm结构体gcc内存边界对齐问题(zt)
- (原创)VB调用DLL(VC)使用结构体参数时的内存对齐及分配的问题.
- 关于 struct 和 union 存储时内存边界对齐的问题(二)
- gcc 中结构体(struct)内存对齐问题分析
- 内存对齐问题(原创)(看完记得回帖)
- ARM内存边界对齐以及sizeof问题
- GCC的内存边界对齐
- c++内存中字节对齐问题详解
- 结构体的内存对齐问题探索
- C中的内存字节对齐问题(修改补充版)
- C语言的结构与联合内存对齐问题:结构或者联合大小取决于?
- C语言结构体内存对齐问题
- 解析C语言结构体对齐(内存对齐问题)
- C语言结构体的内存对齐问题
- 关于pragma pack的用法--------------C++中的内存对齐问题
- C++测试类大小中的内存对齐问题
- 内存对齐问题
- 最透彻的讲解结构体成员内存对齐问题——透彻理解哦
- 数据结构内存边界对齐的三条原则 - jcwKyl的专栏 - CSDN博客
- 【原创】回答网友关于ARM9 S3C2440 wince6.0 内存 128M的使用问题