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

时间:2014-12-20 18:06:55

标签: c++ gcc optimization

目前我正在使用GNU C ++ - 编译器和-Os优化选项进行一些实验,以实现最小的代码大小。我使用以下命令在-Os检查了启用的编译器标志:

g++ -c -Q -Os --help=optimizers | grep "enabled"


我得到了启用选项列表:

-faggressive-loop-optimizations [enabled]
-falign-functions               [enabled]
-falign-jumps                   [enabled]
-falign-labels                  [enabled]
-falign-loops                   [enabled]
-fasynchronous-unwind-tables    [enabled]
                 ...


这看起来有点奇怪,因为我也查了一下,应该在-Os,here启用哪些标志,并在-Os部分写入,应该禁用所有falign-选项以进行代码最小化


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



我的gcc版本是4.9.2,我正在使用Arch-Linux。

已经感谢您的帮助:)。

1 个答案:

答案 0 :(得分:2)

  问:这是一个错误还是我在这里做错了什么?在阅读了falign-flags之后我真的认为应该在-Os

中禁用它们

我认为Hans在找到部分问题方面做得很好。它肯定是一个文档错误。但是GCC没有人评论为什么-Os启用了它们,所以你可能没有所有的信息。

较旧的ARM设备非常不容忍未对齐的访问。较旧的臂设备包括ARMv4,我认为ARMv5。如果您执行了未对齐的访问权限,那么您将获得SIGBUS(在那里,完成了,得到了T恤)。

现代ARM设备修复了x86处理器之类的未对齐访问,因此您不再获得SIGBUS。相反,你只需要承担性能损失。

如果这些选项是旧版ARM设备支持的工件,则应尝试指定体系结构。例如,-march=armv7。如果你在ARMv6和ARMv7上找到它,那可能仍然是一个bug。这取决于GCC团队是否认为权衡对ARM来说是足够的(代码大小与性能损失)。

相关问题