Atom2004 发表于 2017-11-2 13:54

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

例如下面这样的代码。
uint32_t a;
uint8_t b;
uint32_t c;
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

msblast 发表于 2017-11-9 10:31
pack
align

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

另外请教一下pack是什么含义啊?
页: [1]
查看完整版本: 请问编译器会自动优化变量的对齐问题吗?