打印
[牛人杂谈]

ARM内存边界对齐以及sizeof问题

[复制链接]
602|2
手机看帖
扫描二维码
随时随地手机跟帖
跳转到指定楼层
楼主
侣行天下|  楼主 | 2015-12-12 17:12 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
默认情况下,在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编译选项了。
沙发
643757107| | 2015-12-12 18:06 | 只看该作者
ypedef struct pack{  }__attribute__((packed))    可利用__attribute__属性

使用特权

评论回复
板凳
天灵灵地灵灵| | 2015-12-12 19:16 | 只看该作者
质量较差的程序可能需要你部分自然对齐,部分一字 节对齐,那就是没有规划好

使用特权

评论回复
发新帖 我要提问
您需要登录后才可以回帖 登录 | 注册

本版积分规则

30

主题

265

帖子

0

粉丝