我们从2011年坚守至今,只想做存粹的技术论坛。  由于网站在外面,点击附件后要很长世间才弹出下载,请耐心等待,勿重复点击不要用Edge和IE浏览器下载,否则提示不安全下载不了

 找回密码
 立即注册
搜索
查看: 863|回复: 4

[技术文章] ARM内存边界对齐以及sizeof问题

[复制链接]

该用户从未签到

27

主题

8

回帖

0

积分

二级逆天

积分
0

终身成就奖

发表于 2020-12-14 10:04:09 | 显示全部楼层 |阅读模式

马上注册,结交更多好友,享用更多功能,让你轻松玩转社区

您需要 登录 才可以下载或查看,没有账号?立即注册

×
默认情况下,在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编译选项了。
回复

使用道具 举报

  • TA的每日心情
    慵懒
    2024-6-14 16:03
  • 签到天数: 16 天

    [LV.4]偶尔看看III

    0

    主题

    1万

    回帖

    7618

    积分

    二级逆天

    积分
    7618

    终身成就奖特殊贡献奖原创先锋奖优秀斑竹奖

    QQ
    发表于 2020-12-14 15:29:56 | 显示全部楼层
    回复

    使用道具 举报

    该用户从未签到

    2

    主题

    1052

    回帖

    0

    积分

    二级逆天

    积分
    0

    社区居民终身成就奖优秀斑竹奖

    QQ
    发表于 2020-12-14 16:59:35 | 显示全部楼层
    回复

    使用道具 举报

    该用户从未签到

    5

    主题

    2183

    回帖

    10

    积分

    二级逆天

    积分
    10

    终身成就奖特殊贡献奖原创先锋奖优秀斑竹奖

    发表于 2020-12-15 08:06:25 | 显示全部楼层
    回复

    使用道具 举报

    该用户从未签到

    37

    主题

    172

    回帖

    0

    积分

    二级逆天

    积分
    0

    终身成就奖

    发表于 2020-12-15 08:42:36 | 显示全部楼层
    回复

    使用道具 举报

    您需要登录后才可以回帖 登录 | 立即注册

    本版积分规则

    公告:服务器刚移机,
    大家请不要下载东西。
    会下载失败


    Copyright ©2011-2024 NTpcb.com All Right Reserved.  Powered by Discuz! (NTpcb)

    本站信息均由会员发表,不代表NTpcb立场,如侵犯了您的权利请发帖投诉

    ( 闽ICP备2024076463号-1 ) 论坛技术支持QQ群171867948 ,论坛问题,充值问题请联系QQ1308068381

    平平安安
    TOP
    快速回复 返回顶部 返回列表