我在makefile中看到了很多这样的标志。它是什么意思,什么时候应该使用?
答案 0 :(得分:34)
优化等级2.
来自GCC手册页:
-O1优化。优化编译需要更多时间和更多 更大的功能内存。
-O2优化甚至更多。 GCC几乎执行所有支持的优化 不涉及太空速度 交易。编译器没有 执行循环展开或功能 指定-O2时内联。如 与-O相比,此选项增加 编译时间和编译时间 生成代码的性能。
-O3优化更多。 -O3打开-O2和-O2指定的所有优化 也开启了-finline-functions, -funswitch-loops,-fpredictive-commoning,-fgcse-after-reload和-ftree-vectorize选项。
-O0减少编译时间并使调试产生预期效果 结果。这是默认值。
-Os优化尺寸。 -Os启用所有通常不会增加代码大小的-O2优化。它也是 进行进一步的优化 旨在减少代码大小。
答案 1 :(得分:12)
优化级别2,最大值为3。 请参阅:http://gcc.gnu.org/onlinedocs/gcc/Optimize-Options.html
请注意,在几年前-O3
可能会因过度“优化”代码而导致一些故障。 AFAIK,现代版GCC不再适用。但由于惯性,-O2
被认为是“最安全的”。
答案 2 :(得分:3)
这是一个优化开关。见gcc --help。
答案 3 :(得分:2)
编译器可以使用各种优化技术,如循环展开,CPU流水线优化来查找无用的代码,避免数据危险,从而加快代码速度。例如,发生固定次数的循环将转换为连续代码而不会产生循环控制开销。或者,如果所有循环迭代都是独立的,则可以进行一些代码并行化。
将优化级别设置为2表示编译器应该花多少精力来寻找这些优化。可能的值范围为1到3
您可以详细了解编译器可以采取哪些措施来优化代码:http://en.wikipedia.org/wiki/Compiler_optimization
答案 4 :(得分:2)
尝试过手册页?
-O2
进一步优化。 GCC几乎全部支持 不涉及空速交换的优化。该 编译器不执行循环展开或函数内联时 你指定-O2。与-O相比,此选项会增加两者 编译时间和生成代码的性能。
用人的话来说:它是最真实安全的优化方式。 -O3进行重组,有时会很麻烦。这样的主题相当深刻。
答案 5 :(得分:1)
如果没有任何优化选项,编译器的目标是降低编译成本并使调试产生预期结果。启用优化使编译器尝试以编译时间和可能的调试程序的能力为代价来改进性能和/或代码大小。
默认为优化关闭。这导致编译时间最快,但编译器绝对不会尝试进行优化,并且生成的程序比启用优化时要大得多且速度慢。 gcc中有各种-O开关(允许的形式为-O0,-O1 -O2,-O3和-Os)来控制优化级别:
-O0没有优化;生成未经优化的代码,但编译时间最短。这是默认值。
-O1中等优化;优化得相当好,但不会显着降低编译时间。大功能需要更多的内存。
-O2 GCC执行几乎所有支持的优化,不涉及空速 - 权衡。指定
时,编译器不执行循环展开或函数内联-O3完全优化,如-O2;还使用更积极的自动内联单元内的子程序并尝试向量化循环。它还打开了-finline-functions,-funswitch-loops,-fpredictive-commoning,-fgcse-after-reload和-ftree-vectorize选项。
-Os优化尺寸。 -Os启用所有通常不会增加代码大小的-O2优化。它还执行旨在减少代码大小的进一步优化。
要了解有关各种优化级别使用的标志/选项及其详细信息的更多信息: http://gcc.gnu.org/onlinedocs/gcc/Optimize-Options.html