[STM32] 请问编译器会自动优化变量的对齐问题吗?

[复制链接]
1424|7
 楼主| Atom2004 发表于 2017-11-2 13:54 | 显示全部楼层 |阅读模式
例如下面这样的代码。
  1. uint32_t a;
  2. uint8_t b;
  3. uint32_t c;
  4. uint8_t d


对于32位芯片,应该是需要4字节对齐的。那按常理这4个变量应该占用了13个字节了。

请问在keil里面进行编译的时候,编译器是否会将这几个变量优化成 a,c,b,d 这样排列呢?这样子就只需要占用10字节了。
aozima 发表于 2017-11-2 16:12 | 显示全部楼层
可能会,甚至丢弃末引用的变量,但不可预测,不同的编译,不同的优化等级,甚至同样的编译器不同的版本,行为也可能完全不一样。
对于普通变量,用户不必理会。
 楼主| Atom2004 发表于 2017-11-6 11:41 | 显示全部楼层
aozima 发表于 2017-11-2 16:12
可能会,甚至丢弃末引用的变量,但不可预测,不同的编译,不同的优化等级,甚至同样的编译器不同的版本,行 ...

你指的普通变量是指怎么样的变量呢?
airwill 发表于 2017-11-8 22:37 | 显示全部楼层
至少到目前位置, 我还没有发现编译器自动调整存储位置的能力.
不妨可以编译试试. 用生成的 MAP 文件验证就是了
john_lee 发表于 2017-11-9 10:28 | 显示全部楼层
本帖最后由 john_lee 于 2017-11-9 10:30 编辑

原则上可以,而且也应该这样做,但还是要看编译器。
程序里不能假设某个变量与其它变量有固定的位置关系和顺序关系(聚集类型的内部变量之间是有顺序关系的)。
msblast 发表于 2017-11-9 10:31 | 显示全部楼层
pack
align
 楼主| Atom2004 发表于 2017-12-1 11:08 | 显示全部楼层
Atom2004 发表于 2017-11-6 11:41
你指的普通变量是指怎么样的变量呢?

就是像上面描述那样子定义的变量,用int32_t定义的局部或者全局标量。
 楼主| Atom2004 发表于 2017-12-1 11:10 | 显示全部楼层

align的属性应该是指定该变量按照指定的对齐宽度进行对齐吧?和变量间的顺序应该没有关系的吧?

另外请教一下pack是什么含义啊?
您需要登录后才可以回帖 登录 | 注册

本版积分规则

28

主题

85

帖子

0

粉丝
快速回复 在线客服 返回列表 返回顶部