g++ 在 -OS 处启用错误的标志
g++ enables wrong flags at -Os
目前我正在用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(代码大小与性能损失(。
相关文章:
- 有关使用标志位设置内部错误标志的说明
- Clang:覆盖之前在命令行上指定的所有警告和错误警告标志
- std::function, Clang 6.0 & MSVC (10.0017134.12) - 可能的 ABI 错误或必需的编译器标志
- 为什么在编译过程中尽管有 -I(破折号大写 i)标志,但仍会出现未定义的引用错误?
- 为什么我必须将错误状态标志设置为 goodbit 才能使其工作
- C - iStream错误标志
- 链接QT5库会自动将额外的FPIC标志传递给NVCC编译器,并通过cmake Cause错误
- 安装XLNT后,具有-lxnt标志的G 错误
- 用错误的标志顺序编译后,是否删除*.cpp文件
- 可以清除流的单个错误状态标志
- std::ostringstream将标志放在错误的位置
- 为什么std::istringstream在没有引发故障位标志的情况下生成错误的结果
- 优化标志会导致计算错误
- 使用 ios::Nocreate 标志会导致"undeclared identifier"错误
- 标志 ios_base::app 的错误行为
- GCC 错误错误的 ELF 类:ELFCLASS64,尽管有 -m64 标志
- 异常是否应具有标志/消息,或者每个错误应具有异常类型
- OpenCV错误:错误标志
- 有没有办法将 WinAPI 错误标志作为字符串获取
- 读取文件时避免错误标志