使用GCC编译优化代码时,优化等级分为0级,1级,2级,3级,使用-O
相关选项来设置。
-O0:0级,不做任何优化。没有加-O相关选项的话,这是默认的选项。
-O1:1级,最基础的优化选项,等价于使用-O。优化代码大小和执行时间,包括对代码的分支、常量以及表达式等进行优化。
-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。
-O相关选项具体打开了哪些优化可以参考gcc manual手册(https://gcc.gnu.org/onlinedocs/gcc/Optimize-Options.html#Optimize-Options),也可以通过gcc -O3 -Q --help=optimizers
编译选项来查看。需要注意的是,-O相关选项除了打开手册中列出的优化外,还会打开一些内置的优化,这些优化与优化等级以及GCC版本有关。因此,-O2并不等于-O1加上手册中列出的-O2在-O1上增加的优化选项。
对于GCC的优化选项,-f是enable, -fno-是disable,手册中只给出了常用的形式,它的反面可以类推。如-finline-functions和-fno-inline-functions。
GCC手册中对于优化参数的说明,省略了一些基础优化的介绍,例如公共子表达删除、表达式化简、cross jumping等,可以通过bing(https://cn.bing.com/)搜索一些基础优化的知识。
最后,如果想知道当前的编译命令到底enable了哪些具体的编译选项(包括GCC默认的),可以增加-fverbose-asm -S
选项。这会生成一个.s
的汇编文件,这个汇编文件的开头详细列出了当前GCC使用的所有编译选项。并且,汇编代码对应的源代码(.c/cpp)也列出来了。结合源代码看对应的汇编代码,也比较容易理解。
GCC 中-O相关优化选项的解析
最后编辑于 :
©著作权归作者所有,转载或内容合作请联系作者
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。
推荐阅读更多精彩内容
- register 使用修饰符register声明的变量属于寄存器存储类型。该类型与自动存储类型相似,具有自动存储时...
- Valgrind Quick Start Guide 该篇参考官方文档,提供基本使用 Memcheck 检查内存使...
- emcc 使用语法: Emscripten是用于编译为使用LLVM构建的asm.js和WebAssembly的工具...