1.前言
编译优化通过对编译时间、目标文件大小、执行效率进行不同的取舍和平衡,来提供整体性能。优化的方法大致包括:1)精简操作指令;2)尽量做到CPU的流水操作;3)对程序的猜测,调整代码的执行顺序;4)充分使用寄存器;5)对调用进行展开操作。
对程序进行合理的优化,可以很好地改善代码大小,提高程序的执行性能,但是优化后,也可能出现一些莫名其妙的问题。这里对编译优化做一个总结描述。
2.官方编译说明链接
https://gcc.gnu.org/onlinedocs/gcc/Optimize-Options.html
3.优化等级
优化级别的参数有:-O0、-O1、-O2、-O3、-Og、-Os、-Ofast
编译优化等级 | 说明 | 描述 |
-O0 | 无优化 | 不做任何优化,减少编译时间并使调试可以产生预期的结果。 |
-O1 | 基本优化 | 编译器在不花费太多编译时间的同时,尝试生成更快更小的代码。 |
-O2 | 比O1更高优化 | 这是推荐的优化等级,除非你有特殊的需求。-O2会比-O1启用多一些标记。设置了-O2后,编译器会试图提高代码性能而不会增大体积和大量占用的编译时间。 |
-O3 | 危险优化等级 | 会延长代码的编译时间,将生成更大体积和更耗内存的二进制文件,增加编译失败的概率或不可预知的程序行为。 |
-Og | O1基础上,去掉影响调试的优化 | 如果最终是为了调试程序,可以使用这个参数。 |
-Os | 代码大小优化 | 主要对代码大小优化,通常各种优化会打乱程序的结构,让调试工作变得无从着手,并且会打乱执行顺序,依赖内存操作顺序的程序需要做相关处理才能保证程序的正确性。如果想要更小的可执行程序,可选择这个参数 |
-Ofast | 优化到破坏标准合规性的点 | 是在O3的基础上,添加了一些非常规优化,这些优化是通过打破一些国际标准(比如一些数学函数的实现标准)来实现的,所以一般不推荐使用该参数。 |
4.优缺点
优点:优化等级越高,所需时间越长,但程序运行起来一般会更高效。
缺点:延长编译时间,且优化等级过高后,可能会导致意想不到的错误。