[牛人杂谈]

ARM编程的结构体对齐

[复制链接]
1211|15
手机看帖
扫描二维码
随时随地手机跟帖
xuanhuanzi|  楼主 | 2018-3-18 08:58 | 显示全部楼层 |阅读模式
之前一直不懂什么是对齐,,,现在明白了,分享来
结构体是由基本数据类型构成,并用一个标识符来命名的变量的集合,要先定义后使用。ARM 系统开发中使用结构体要考虑怎样最佳地控制存储器布局(即结构成员地址边界的对齐问题)。假设系统采用大端模式的存储器,下面的例子分析了如何优化结构体在映像文件中数据布局的问题。
QQ截图20180318085820.png
xuanhuanzi|  楼主 | 2018-3-18 08:59 | 显示全部楼层


那么大家看明白这个图了吗,就是先把占据最大行的找出来,放上去,然后前后按顺序放,如果可以排列的下,就排列到一行,如果不够,那么后面就空白浪费掉了。
此外,关键词__packed 可以使数据1 字节对齐,不会插入任何填充位来实现字节对齐,但会破坏数
据的对齐,故节省空间的同时牺牲了效率,不提倡使用。

使用特权

评论回复
huangcunxiake| | 2018-3-18 18:30 | 显示全部楼层
有道理,这么做,可以让代码更加紧凑。方便使用结构体和联合等。

使用特权

评论回复
xinpian101| | 2018-3-19 13:15 | 显示全部楼层
这个图,我看了半天终于看懂了,原来如此,,,这个在内存中的存储顺序,是编译器做的,还是硬件本身决定的。

使用特权

评论回复
xinpian101| | 2018-3-19 13:15 | 显示全部楼层
如果是编译器做的,编译器绝对可以自动修正这个排列顺序啊。

使用特权

评论回复
ayb_ice| | 2018-3-19 16:28 | 显示全部楼层
这是编译器完成的

使用特权

评论回复
598330983| | 2018-3-20 22:53 | 显示全部楼层
编译器不给你自动校正是因为你可能要用到指针操作这些顺序,如果顺序乱了,到时候你指针就操作跟你想要的不同。

使用特权

评论回复
ayb_ice| | 2018-3-21 10:42 | 显示全部楼层
xinpian101 发表于 2018-3-19 13:15
如果是编译器做的,编译器绝对可以自动修正这个排列顺序啊。

编译器不会去改变顺序,也不能改变

使用特权

评论回复
小灵通2018| | 2018-3-21 11:52 | 显示全部楼层
我也觉得编译器不应该改变这个顺序,一单改变还真是那样,如果用指针操作,那就找不到原来位置的数据了。

使用特权

评论回复
天灵灵地灵灵| | 2018-3-21 16:55 | 显示全部楼层
这个讲的透彻。

使用特权

评论回复
玛尼玛尼哄| | 2018-3-21 17:30 | 显示全部楼层
确实很有用。

使用特权

评论回复
telesoft| | 2018-4-9 12:46 | 显示全部楼层
INT有4BYTE,高BYTE在前还是在后?

使用特权

评论回复
xuanhuanzi|  楼主 | 2018-4-11 20:55 | 显示全部楼层
telesoft 发表于 2018-4-9 12:46
INT有4BYTE,高BYTE在前还是在后?

可以写个测试一下啊,通过位操作,看看到底在那额

使用特权

评论回复
zhuotuzi| | 2018-4-12 17:02 | 显示全部楼层
这种考虑当然好,不过如果你是内存容量相对充足,不必吧。

使用特权

评论回复
dongliushui| | 2018-4-14 10:46 | 显示全部楼层
这就在使用变量上做好规划了。

使用特权

评论回复
wahahaheihei| | 2018-4-15 18:05 | 显示全部楼层
这样看确实好啊,强迫症有救了。

使用特权

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

本版积分规则

152

主题

2055

帖子

2

粉丝