gcc - 我应该优化多少?

标签 gcc compiler-optimization compiler-flags

关于编译器 (GCC) 所做的优化,标准做法是什么?每个选项(-O、-O1、-O2、-O3、-Os、-s、-fexpensive-optimizations)有什么不同,我如何决定什么是最佳的?

最佳答案

通常 -O2 是一个很好的优化级别,可以先尝试。

但是,如果您希望获得最佳结果,您最终将尝试许多优化级别,因为您无法事先确定哪个级别最适合您的应用程序。

另请注意,优化结果应因每个 CPU 的不同而不同(在某些 CPU 上,优化大小实际上可能比优化速度产生更好的速度)。

仅供将来引用,这里是每个级别的简要说明(您可以在文档 http://gcc.gnu.org/onlinedocs/gcc/Optimize-Options.html 中找到完整的说明):

-O(与 -O1 相同):
使用 -O,编译器会尝试减少代码大小和执行时间,而不执行任何需要大量编译时间的优化。

-O2:进一步优化。 GCC 执行几乎所有不涉及空间速度权衡的受支持优化。与 -O 相比,此选项会增加编译时间和生成代码的性能。

-O3:优化更多。 -O3 打开 -O2 指定的所有优化,并打开 -finline-functions、-funswitch-loops、-fpredictive-commoning、-fgcse-after-reload、-ftree-vectorize、-ftree-partial-pre 和 - fipa-cp-clone 选项。

-Os:优化大小。 -Os 启用所有通常不会增加代码大小的 -O2 优化。它还执行旨在减少代码大小的进一步优化。

-Ofast:无视严格的标准合规性。 -Ofast 启用所有 -O3 优化。它还支持对所有符合标准的程序无效的优化。它打开 -ffast-math 和 Fortran 特定的 -fno-protect-parens 和 -fstack-arrays。
如果您使用多个 -O 选项,无论是否有级别编号,最后一个这样的选项是有效的。

关于gcc - 我应该优化多少?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/10924513/

相关文章:

objective-c - 如何通过 .xcconfig 禁用特定的 clang 诊断?

g++ - 编译器标志以显示 strdup 等函数

c - "Hacking: The Art of Exploitation": why does example program work with just gcc but not with -m32?

c - '-c' 选项在 GCC 中有什么作用?

c++ - 具有 void 类型分支的三元运算符

c# - 为什么算术表达式没有针对 C# 中的 0 乘法进行优化

c++ - 未定义对 `__gxx_personality_sj0` 的引用

c++ - 链接静态库的 CMake 项目

c - realloc()、生命周期和 UB

c - 影响 gcc 中的函数克隆/复制/持续传播