1. gcc中指定优化级别的参数有:-O0、-O1、-O2、-O3、-Og、-Os、-Ofast。
2. 在编译时,如果没有指定上面的任何优化参数,则默认为 -O0,即没有优化。
3. 参数 -O1、-O2、-O3 中,随着数字变大,代码的优化程度也越高,不过这在某种意义上来说,也是以牺牲程序的可调试性为代价的。
4. 参数 -Og 是在 -O1 的基础上,去掉了那些影响调试的优化,所以如果最终是为了调试程序,可以使用这个参数。不过光有这个参数也是不行的,这个参数只是告诉编译器,编译后的代码不要影响调试,但调试信息的生成还是靠 -g 参数的。
5. 参数 -Os 是在 -O2 的基础上,去掉了那些会导致最终可执行程序增大的优化,如果想要更小的可执行程序,可选择这个参数。
6. 参数 -Ofast 是在 -O3 的基础上,添加了一些非常规优化,这些优化是通过打破一些国际标准(比如一些数学函数的实现标准)来实现的,所以一般不推荐使用该参数。
7. 如果想知道上面的优化参数具体做了哪些优化,可以使用 gcc -Q –help=optimizers 命令来查询,比如下面是查询 -O3 参数开启了哪些优化:
$ gcc -Q --help=optimizers -O3 ... -fassociative-math [disabled] -fassume-phsa [enabled] ...
如果想知道不同的优化级别有什么具体区别,可以使用输出重定向把内容输出到文本文件,再用diff命令对比两个文件的差异。
如:
gcc -Q --help=optimizers -O3 > O3.txt gcc -Q --help=optimizers -Ofast > Ofast.txt diff O3.txt Ofast.txt 输出结果如下: 15c15 < -fassociative-math [disabled] --- > -fassociative-math [enabled] 32c32 < -fcx-limited-range [disabled] --- > -fcx-limited-range [enabled] 45c45 < -ffinite-math-only [disabled] --- > -ffinite-math-only [enabled] 102c102 < -fmath-errno [enabled] --- > -fmath-errno [disabled] 123c123 < -freciprocal-math [disabled] --- > -freciprocal-math [enabled] 164c164 < -fsigned-zeros [enabled] --- > -fsigned-zeros [disabled] 188c188 < -ftrapping-math [enabled] --- > -ftrapping-math [disabled] 229c229 < -funsafe-math-optimizations [disabled] --- > -funsafe-math-optimizations [enabled]
转载请注明:《GCC 优化级别》