使用GCC编译优化代码时,优化等级分为0级,1级,2级,3级,使用-O相关选项来设置
-O0:0级,不做任何优化。没有加-O相关选项的话,这是默认的选项。
-O1(-O):1级,最基础的优化选项。优化代码大小和执行时间,包括对代码的分支,常量以及表达式等进行优化。
-O2:2级,推荐的优化选项。在-O1基础上增加了更多的优化,包括过程间优化,寄存器级和指令级的优化,内联优化等。GNU发布软件时,默认使用的优化就是-O2优化。
-Os:2级,优化代码大小。打开了-O2中的大部分优化,但是去除了-O2中会增加代码大小的优化,例如指令预取,函数对齐等(优化后会增加一些代码)
-O3:3级,最高的安全优化选项。在-O2基础上增加了更多的优化,包括一些循环优化,向量优化等。
-Ofast: 3级,在-O3基础上增加了一些不安全的优化。例如, -Ofast开启的一个选项 “-ffast-math”,包含了很多份IEEE/ISO标准的优化,虽然能加速但会降低精度,也可能会产生一些错误的结果(主要影响高精度的浮点运算)
-Og: 1级,用于调试的基础优化选项。在-O0基础上增加了一些不影响调试的优化,同时也会收集一些调试信息。不过需要调试时,还是要额外增加-g选项。
需要注意,-O0(也就是GCC默认的优化)会disable大多数的优化选项,所以使用某一个优化选项时,需要加上-O1及以上的选项。如果同时使用了多个-O相关选项,不管是哪个级别,只有命令行的最后一个-O选项有效。此外在GCC中,-O4, -O5等类似选项会被转换成-O3,因为GCC最高只有-O3.
gcc -O3 -Q --help=optimizers可查看
最后,如果想知道当前的编译命令到底enable了哪些具体的编译选项(包括GCC默认的),可以增加-fverbose-asm -S选项。这会生成一个.s的汇编文件,这个汇编文件的开头详细列出了当前GCC使用的所有编译选项。并且,汇编代码对应的源代码(.c/cpp)也列出来了。结合源代码看对应的汇编代码,也比较容易理解。
转载:https://www.jianshu.com/p/dafd8aad95e6