Tre*_*zJo 6 c++ optimization gcc
目前我正在使用GNU C++ - 编译器和-Os优化选项进行一些实验,以实现最小的代码大小.我使用以下命令在-Os检查了启用的编译器标志:
g++ -c -Q -Os --help=optimizers | grep "enabled"
Run Code Online (Sandbox Code Playgroud)
我得到了这个启用选项的列表:
-faggressive-loop-optimizations [enabled]
-falign-functions [enabled]
-falign-jumps [enabled]
-falign-labels [enabled]
-falign-loops [enabled]
-fasynchronous-unwind-tables [enabled]
...
Run Code Online (Sandbox Code Playgroud)
这看起来有点奇怪,因为我也查了一下,应该在-Os启用哪些标志,这里和-Os部分下面写的是falign-应该禁用所有选项以进行代码最小化.
问:这是一个错误还是我在这里做错了什么?看完falign-标志之后的原因我真的认为应该在-Os中禁用它们!
我的gcc版本是4.9.2,我正在使用Arch-Linux.
已经感谢帮助:)
问:这是一个错误还是我在这里做错了什么?因为在阅读了 falign- 标志的作用后,我真的认为它们应该在 -Os 中禁用
我认为汉斯在找到部分问题方面做得很好。这绝对是一个文档错误。但 GCC 没有人评论为什么-Os启用它们,所以您可能不知道所有信息。
较旧的 ARM 设备非常不能容忍未对齐的访问。较旧的 ARM 设备包括 ARMv4,我认为是 ARMv5。如果您执行未对齐的访问,您将得到SIGBUS(去过那里,完成了该操作,得到了 T 恤)。
现代 ARM 设备像 x86 处理器一样修复未对齐的访问,因此您不再获得SIGBUS. 相反,您只需承受性能损失。
您应该尝试指定一个体系结构,以防这些选项是旧版 ARM 设备支持的产物。例如,-march=armv7。如果您在 ARMv6 和 ARMv7 上发现它,那么这仍然可能是一个错误。这取决于 GCC 团队是否认为这种权衡对于 ARM 来说足够(代码大小与性能损失)。