打印

[求助]MDK中全局变量字节对齐问题

[复制链接]
7351|4
手机看帖
扫描二维码
随时随地手机跟帖
跳转到指定楼层
楼主
864|  楼主 | 2010-7-26 11:06 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
本帖最后由 864 于 2010-7-26 13:15 编辑

操作环境MDK 3.7

一、对于定义的全局变量,编译器是否会尽量安排成字对齐?

二、我定义了一个全局数组,使用时发现首地址不是字对齐的,请问有什么方法在定义数组时强制成字对齐,谢谢。

试验如下:
一、
定义 UINT8 AA[16];
定义 UINT8 BB[16];
得到的数组AA BB首地址不是字对齐的

二、
定义 UINT8  AA[16];
定义 UINT16 BB[16];
得到的数组AA BB首地址不是字对齐的

三、
定义 UINT8 AA[16];
定义 UINT32 BB[16];
得到的数组AA BB首地址字对齐的

相关帖子

沙发
xinzha| | 2010-7-26 13:36 | 只看该作者
使用__align(n)编译选项,n可以选择1,2,4,8。
对于arm来说,它执行的策略是类型边界对齐,也就是说字节型数据对齐于字节边界,半字型数据对齐于半字边界,而字型数据对齐于字边界。
下面的链接是arm的官方文档说明。
http://infocenter.arm.com/help/i ... 0491a/BABDFECC.html

使用特权

评论回复
板凳
864|  楼主 | 2010-7-26 14:08 | 只看该作者
2# xinzha

非常感谢,另外对我那三个试验有个疑问,为什么我定义UINT32的数组后UINT8的地址也是字对齐了呢,而且UINT32那个数组的首地址是在UINT8那个数组的后面

使用特权

评论回复
地板
xinzha| | 2010-7-26 14:20 | 只看该作者
本帖最后由 xinzha 于 2010-7-26 14:24 编辑

uint32的数组,只要你不是强行指定非四字节对齐,那么编译器就会自动找到下一个四字节对齐的起始地址来存放这个数组,而在空间上,后面的字节型数组与你前面定义的字型数组是紧密相连的,既然前面对齐了,那么后面的首地址自然对齐了。
啊,是后面定义了字型数组,前面的字节型就对齐了?那只能是编译器的一种策略或者纯属巧合

使用特权

评论回复
5
864|  楼主 | 2010-7-26 15:26 | 只看该作者
4# xinzha

非常感谢!

使用特权

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

本版积分规则

864
个人签名:每天定心一小时!

18

主题

239

帖子

0

粉丝