g ++在-Os启用错误标志

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.

已经感谢帮助:)

jww*_*jww 2

问:这是一个错误还是我在这里做错了什么?因为在阅读了 falign- 标志的作用后,我真的认为它们应该在 -Os 中禁用

我认为汉斯在找到部分问题方面做得很好。这绝对是一个文档错误。但 GCC 没有人评论为什么-Os启用它们,所以您可能不知道所有信息。

较旧的 ARM 设备非常不能容忍未对齐的访问。较旧的 ARM 设备包括 ARMv4,我认为是 ARMv5。如果您执行未对齐的访问,您将得到SIGBUS(去过那里,完成了该操作,得到了 T 恤)。

现代 ARM 设备像 x86 处理器一样修复未对齐的访问,因此您不再获得SIGBUS. 相反,您只需承受性能损失。

您应该尝试指定一个体系结构,以防这些选项是旧版 ARM 设备支持的产物。例如,-march=armv7。如果您在 ARMv6 和 ARMv7 上发现它,那么这仍然可能是一个错误。这取决于 GCC 团队是否认为这种权衡对于 ARM 来说足够(代码大小与性能损失)。