Your Ad Here
首页 | 编程语言 | 网站建设 | 游戏天堂 | 冲浪宝典 | 网络安全 | 操作系统 | 软件时空 | 硬件指南 | 病毒相关 | IT 认证
软讯网络 > 操作系统 > Linux > [B原创] Arm/x86结构体gcc内存边界对齐问题
【标  题】:[B原创] Arm/x86结构体gcc内存边界对齐问题
【关键字】:Arm/x86,gcc
【来  源】:http://blog.csdn.net/bekars/archive/2006/02/21/604677.aspx

[B原创] Arm/x86结构体gcc内存边界对齐问题

Your Ad Here

这段时间移植公司的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编译选项了。

华丽的3D桌面XGL(附精彩视频):【上一篇】
一句话Linux(备查):【下一篇】
【相关文章】
  • gcc 版本问题
  • win32下使用gcc编译供java 调用的dll须知(jini)
  • GCC 简介zt
  • GCC —— 一切从这里开始
  • GCC起步zt
  • GCC中文手册zt
  • 在cygwin下安装gcc4.0zt
  • Window+GCC+CDT用Eclipse开发C、C++
  • GCC 参数详解
  • gcc for windows 环境搭建
  • 【随机文章】
  • Magic Linux
  • 还有两天河南BOSS1.5要割接了,快解放了
  • CNC教程---钻孔介绍
  • 《深入Spring2》第五章“AOP及在Spring中的应用”的电子版出来了
  • Request废话连篇
  • 网通搭建宁波市建行VPN
  • Making Headlines with RSS
  • C#与DLL和COM的混合编程(1)-C#调用C++写的非托管的DLL中导出的函数
  • 天堂2 天堂2外挂
  • solaris 9下限制某些IP TELNET到本机
  • 【相关评论】
    没有相关评论
    【发表评论】
    姓名:
    邮件:
    随机码*
    评论*
          
    |  首 页  |  版权声明  |  联系我们   |  网站地图  |
    CopyRight © 2004-2007 bbb软讯网络 All Rigths Reserved.