gcc -O2 的含义
Posted
技术标签:
【中文标题】gcc -O2 的含义【英文标题】:Meaning of gcc -O2 【发布时间】:2009-03-17 18:00:15 【问题描述】:我在 makefile 中经常看到这个标志。什么意思,什么时候用?
【问题讨论】:
@cdonner :他被否决了,因为他在 gcc 的 MAN 页面上提问。也许是故意的? 这家伙问的问题太多了,他自己可以很容易地得到答案。每个谷歌搜索 GCC 的文档? 完全同意布赖恩的观点。人们应该在发布此类问题之前尝试使用 man 和 google。 来自该网站的常见问题解答:没有问题太琐碎或太“新手”。 【参考方案1】:优化级别 2。
来自 GCC 手册页:
-O1 优化。优化编译需要更多的时间,而且很多 大型函数需要更多内存。
-O2 优化更多。 GCC 执行几乎所有支持的优化 不涉及空间速度的 权衡。编译器不 执行循环展开或函数 指定 -O2 时内联。作为 与 -O 相比,此选项增加 编译时间和 生成代码的性能。
-O3 优化更多。 -O3 打开 -O2 指定的所有优化,并且 还打开-finline-functions, -funswitch-loops、-fpredictive-commoning、-fgcse-after-reload 和 -ftree-vectorize 选项。
-O0 减少编译时间并使调试产生预期的结果 结果。这是默认设置。
-Os 优化大小。 -Os 启用通常不会增加代码大小的所有 -O2 优化。它也是 执行进一步优化 旨在减少代码大小。
【讨论】:
【参考方案2】:优化级别 2,最高为 3。 见:http://gcc.gnu.org/onlinedocs/gcc/Optimize-Options.html
请注意,在几年前,-O3
可能会因过度“优化”代码而导致一些故障。 AFAIK,现代版本的 GCC 不再适用。但由于惯性,-O2
被认为是“最安全的”。
【讨论】:
【参考方案3】:这是一个优化开关。请参阅 gcc --help。
【讨论】:
【参考方案4】:编译器可以使用各种优化技术(例如循环展开、CPU 管道优化)来查找无用代码并避免数据危害来加速您的代码。例如,发生固定次数的循环将被转换为连续代码,而没有循环控制开销。或者,如果所有循环迭代都是独立的,则可以进行一些代码并行化。
将优化级别设置为 2 表明编译器应该花费多少精力来寻找这些优化。可能的值范围从 1 到 3
您可以了解更多关于编译器可以做什么来优化您的代码:http://en.wikipedia.org/wiki/Compiler_optimization
【讨论】:
【参考方案5】:尝试过手册页?
-O2
进一步优化。 GCC 执行几乎所有支持的 不涉及空间速度权衡的优化。这 编译器在以下情况下不执行循环展开或函数内联 您指定-O2。与 -O 相比,此选项同时增加 编译时间和生成代码的性能。
用人类的话来说:这是最安全的优化方式。 -O3 进行重组,这有时会很麻烦。这样的主题相当深刻。
【讨论】:
【参考方案6】:在没有任何优化选项的情况下,编译器的目标是降低编译成本并使调试产生预期的结果。开启优化会使编译器尝试以牺牲编译时间和调试程序的能力为代价来提高性能和/或代码大小。
默认关闭优化。这会产生最快的编译时间,但编译器绝对不会尝试优化,并且生成的程序比启用优化时要大得多且慢得多。 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
【讨论】:
以上是关于gcc -O2 的含义的主要内容,如果未能解决你的问题,请参考以下文章