g++ 在 -OS 处启用错误的标志

g++ enables wrong flags at -Os

本文关键字:错误 标志 启用 -OS g++      更新时间:2023-10-16

目前我正在用GNU C++-Compiler和-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 上启用哪些标志,这里和 -Os 部分下写道,应该禁用所有falign-选项以最小化代码。


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



我的 gcc 版本是 4.9.2,我正在研究 Arch-Linux。

已经感谢您对:)的帮助

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

我认为汉斯在发现部分问题方面做得很好。这绝对是一个文档错误。但是海湾合作委员会没有人评论为什么-Os启用它们,所以你可能没有所有的信息。

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

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

应尝试指定体系结构,以防这些选项是较旧的 ARM 设备支持的项目。例如,-march=armv7 .如果您在 ARMv6 和 ARMv7 上找到它,那么这仍然可能是一个错误。这取决于 GCC 团队是否认为权衡足以满足 ARM(代码大小与性能损失(。