#6. 再谈gcc
本书你都在用gcc
,但只使用了gcc
最基本的功能,其实它可以做更多的事。gcc
就像一把瑞士军刀,它有很多特性,利用这些特性你可以严格控制它生成的代码。
优化
gcc
为了提高代码的性能会做很多工作。如果gcc
发现你在循环中对一个变量赋了相同的值,它就会把赋值语句移动到循环外;如果一个小函数只在少数几个地方用到了,gcc
就会把它转化为内联代码,然后插到程序中。
虽然gcc
可以做很多优化,但绝大多数优化选项默认是关闭的。为什么?因为优化需要花很长时间,如果你尚处于开发阶段,通常希望快速编译代码。一旦准备发布代码,就可以打开优化选项。gcc
一共有四个级别的优化:
标志 | 描述 |
-O | 如果在gcc 命令中加上-O (字母O)标志,就能得到第一级别的优化。 |
-O2 | 如果想提升优化等级,降低编译速度,就选择-O2 。 |
-O3 | 如果想再升一级,就选-O3 ,它会使用-O 和-O2 中的所有优化,再附加一些额外的优化。 |
-Ofast | -Ofast 会打开最高级别的优化,同时编译速度也会降到最低。谨慎使用-Ofast ,因为它生成的代码可能和C标准相去甚远。 |
警告
如果代码没有严重错误,但做了一些可疑的事情,比如把一个类型的值赋给一个错误类型的变量,编译器就会显示警告。你可以用-Wall
选项提高警告检查的门槛:
- gcc fred.c -Wall -o fred
-Wall
选项表示“所有警告(All Warnings)”,但因为一些历史原因,-Wall
其实并不会显示所有的警告。如果你想让gcc
那么做,就必须加上-Wextra
选项:
- gcc fred.c -Wall -Wextra -o fred
如果你希望遵循严格的编译,就可以使用-Werror
选项,只要有一个警告,编译就会失败:
当多人开发同一个项目时,-Werror
就显得特别有用,因为它可以维持代码的质量。
更多gcc
选项请参阅: