6.4 优化等级

为了控制编译时间和编译器的内存使用还有可执行文件的速度和空间之间的平衡取舍,GCC提供了一个优化等级,从0到3级同时单独选项也可以指定优化类型。

命令行选项’-OLEVEL’可以选择优化等级,LEVEL的范围是0到3。不同等级的优化效果会在下面讨论:

‘-O0’或者没有’-O’选项(默认)

在这个优化等级下GCC不会做任何优化并用最直接的方式编译源代码。 每一个源码指令都会直接转换为对应的机器指令,不会重新安排指令执 行顺序。当调试程序的时候这是最好的选项。

‘-O0’选项和没有指定’-O’选项是一样的效果。

‘-O1’或者’-O’

这个等级会打开大多数常用优化选项并且不会要求任何速度-空间之间 的取舍。这个选项比使用’-O0’选项会生成体积更小和速度更快的可执 行文件。更加复杂的优化,例如指令调度不会使用在这个等级下。

使用‘-O1’选项编译程序通常比使用’-O0’选项需要更少的时间,因 为在简单优化之后减少了大量需要处理的数据。

‘-O2’

这个选项打开了更多优化类型,除了’-O1’选项的优化类型外。这些其 他优化选项包括指令调度。只有那些没有要求任何速度-空间权衡的优化 选项被使用了,所以没有增加可执行文件的大小。这个选项会比’-O1’ 选项要求更多的编译时间和内存空间。这个选项是生成最终程序的最佳 选择因为它提供了最大化的优化并且没有增加可执行文件的体积。这是 GNU包发布的默认优化等级。

‘-O3’

这个选项打开了代价更大的优化例如函数内联,除了所有低等级的优化 类型外,’-O3’优化等级可能会增加最终程序的运行速度但是也可能增 加它的体积。在有些情况下这些优化可能没有作用反而会减慢程序的实 际运行速度。

‘-funroll-loops’

这个选项使能了循环展开并且这个选项和其他优化选项之间是相互独立 的。它会增加可执行文件的体积。这个优化选项是否会增加程序的执行 速度视情况而定。

‘-Os’

这个选项会选择那些减小可执行文件体积的优化类型。这个选项的目的 是为那些内存或者硬盘受到限制的系统生成最小体积的程序。在某些情 况下体积小的可执行文件运行速度也会更快,因为能更好的使用缓存。

请务必记住优化等级越高花费的代价越大。优化代价包括增加调试的复杂性、增加编译时的时间和内存空间的消耗。在大多数情况下使用’-O0’优化等级用于调试,使用’-O2’选项用于开发和发布。