说明
- 使用GUN编译器编译时可以设置优化等级,编译器会去优化生成的程序。
优化等级
- 优化等级从低到高如下:
- –O0 : 禁止编译器进行优化。
- -O1 :尝试优化编译时间和可执行文件大小等。
- -O2 :会进行部分优化,但不进行循环展开和函数内联等操作。
- -Os : 可以看成 -O2.5,优化代码尺寸的,给一些CPU缓存或是磁盘空间小的机器使用。
- -O3 :会进行循环展开,分支预测,函数内联等,但与O2的2级优化得到的汇编代码一样,可能是因为在O2和O3的Gcc都能识别尾递归调用并进行优化,所以在这里使用了尾调用方式,从代码中也可以看到有一条递归调用指令call main。查资料得到,实现尾递归优化的选项是-foptimize-sibling-calls,是O2新增的的功能。汇编程序如下:
等级选择
- 大写-O后跟等级数字,例如:
gcc main.c -O0 -o app
gcc main.c -O1 -o app
- 通过汇编可知:不填写优化等级即默认等级为0。
注意点
- 测试得知:不管采用哪个优化等级,空函数都没有被优化掉。