GCC:-O3 和 -Os 之间的区别

新手上路,请多包涵

我对 GCC -O3 标志非常熟悉,但它与 -Os 有何不同,在哪种情况下我们应该更喜欢一个?

原文由 Saqlain 发布,翻译遵循 CC BY-SA 4.0 许可协议

阅读 2.1k
2 个回答

GCC 文档 非常明确地描述了这些选项的作用。

-O3 尝试非常优化代码以提高性能。它包括所有优化 -O2 包括,以及更多。

另一方面,-Os 指示 GCC “优化大小”。它启用所有 不会增加可执行文件大小的-O2 优化,然后它还切换一些优化标志以进一步减小可执行文件大小。

请注意,我的描述故意含糊不清 - 阅读 GCC 文档以更深入地讨论究竟为任一优化级别启用了哪些标志。

我相信 -O* 优化级别就是——互斥的、不同的优化 _级别_。混合它们并没有真正的意义,因为两个级别将启用或忽略另一个级别有意忽略或启用的标志(分别)。如果你想混合和匹配(你可能实际上不想这样做,除非你有一个非常好的理由想要一组特定的标志),你最好阅读文档并混合和匹配每个级别的标志手动启用。

我想我还将链接来自 Gentoo Linux Wiki 的 这篇文章,它讨论了优化标志,因为它们与构建操作系统的包有关。显然,并非所有这些都适用,但它仍然包含一些有趣的信息——例如:

使用 -O3 进行编译并不能保证提高性能,事实上,在许多情况下,由于二进制文件较大和内存使用量增加,可能会降低系统速度。 -O3 也可以破坏多个包裹。因此,不建议使用 -O3。

根据那篇文章,在大多数情况下,-O2 与 -O3 一样“好”,并且就损坏的可执行输出而言,使用起来更安全。

原文由 CmdrMoozy 发布,翻译遵循 CC BY-SA 3.0 许可协议

-O3 优化速度,而 -Os 优化空间。这意味着 -O3 会给你一个快速的可执行文件,但它可能会相当大,而 -Os 会给你一个较小的可执行文件,但它可能会更慢。

空间和时间效率通常是一种权衡。更快的算法往往会占用更多空间,而就地算法(不增加空间使用的算法)往往效率较低。

通常现代计算机有足够的内存空间,所以 -O3 通常更可取。但是,如果您正在为低内存(例如小型设备)编程,您可能更喜欢 -Os

原文由 Nathan 发布,翻译遵循 CC BY-SA 3.0 许可协议

撰写回答
你尚未登录,登录后可以
  • 和开发者交流问题的细节
  • 关注并接收问题和回答的更新提醒
  • 参与内容的编辑和改进,让解决方法与时俱进
推荐问题