Saq*_*ain 25 c c++ compiler-construction gcc g++
我对GCC -O3标志非常熟悉,但是它与-Os有何不同,在哪种情况下我们应该优先选择其他?
Cmd*_*ozy 26
在GCC文档描述了这些选项做的很明确.
-O3尝试极大地优化代码以提高性能.它包括所有优化--O2包括,以及更多.
另一方面,-Os指示海湾合作委员会"优化规模".它支持所有不会增加可执行文件大小的 -O2优化,然后它还会切换一些优化标志以进一步减少可执行文件的大小.
请注意,我的描述有点模糊 - 请阅读GCC文档,以便更深入地讨论哪些标志都针对任一优化级别启用.
我相信-O*优化级别就是 - 相互排斥,独特的优化级别.混合它们并没有多大意义,因为两个级别将启用或省略另一个有意遗漏或启用的标志(分别).如果你想混合和匹配(你可能实际上不想这样做,除非你有一个非常好的理由想要一组特定的标志),你最好阅读文档并混合和匹配每个级别的标志手动启用.
我想我还将链接Gentoo Linux Wiki上的这篇文章,该文章讨论了与构建操作系统软件包相关的优化标志.显然并非所有这些都适用,但它仍然包含一些有趣的信息 - 一个:
使用-O3进行编译并不是提高性能的有保证的方法,实际上在很多情况下由于更大的二进制文件和更大的内存使用量而导致系统速度变慢.-O3也可以打破几个包.因此,不建议使用-O3.
根据该文章,-O2在大多数情况下"与-O3一样好",并且对于破碎的可执行输出更安全.
这取决于。您需要优化速度或尺寸吗?
-O3
优化更多。-O3 打开 -O2 指定的所有优化,并打开 -finline-functions、-funswitch-loops、-fpredictive-commoning、-fgcse-after-reload、-ftree-loop-vectorize、-ftree-slp-vectorize 、-fvect-cost-model、-ftree-partial-pre 和 -fipa-cp-clone 选项。-O0
减少编译时间并使调试产生预期结果。这是默认设置。-Os
优化大小。-Os 启用所有通常不会增加代码大小的 -O2 优化。它还执行旨在减少代码大小的进一步优化。
-Os 禁用以下优化标志:
-falign-functions
-falign-jumps
-falign-loops
-falign-labels
-freorder-blocks
-freorder-blocks-and-partition
-fprefetch-loop-arrays
实际上,-O是一长串独立优化的简写。如果您不知道自己需要什么,请选择-O3。
我建议阅读GCC文档.-O3用于获取快速运行的代码(即使以某些代码膨胀为代价),同时-Os
优化生成的代码的大小.
还有很多其他(模糊的)GCC 优化标志(例如-fgcse-sm
),其中许多标志甚至没有启用-O3
.
您可能也会对-flto(用于链接时优化)感兴趣,除了例如-O3
或者-Os
在编译时和链接时都使用.然后也看到这个答案.
最后,请注意使用最新版本的GCC(目前在2013年底为4.8),因为GCC正在显着改进其优化.
您可能还想使用-mtune = native(至少对于x86).
您甚至可以编写自己的优化传递,特定于您自己的特定库和API,可能使用MELT插件.
作为CmdrMoozy回答你可能更喜欢使用-O2
过-O3
(但是请注意,最近版本的GCC有自己提高了很多-O3
,所以Gentoo的引文-recommending反对-O3
和赞成-O2
变得不那么重要.).
此外,正如这篇SlashDot-ed Stack论文(Xi Wang,Nickolai Zeldovich,M.Frans Kaashoek和Armando Solar-Lezama)所示,许多程序并不完全符合C标准,并且当一些有效时不满意(并且表现不正确)优化已完成.未定义的行为是一个棘手的主题.
顺便说一句,请注意,使用-O3
通常会使你的编译时间更大,并且经常(但并非总是)带来最多几个百分点的性能-O2
甚至-O1
...... 甚至......(更糟糕的是-flto
).这就是我很少使用它的原因.