每次编译项目时,编译器会把所有相关的文件复制进项目中并进行编译,但其实,这些被编译的文件中总有一些文件是不会变动的,比如标准库、STL和一些我们自己写的但基本不会更改的头文件等等,可是这些文件却要在每次编译时都被重新包含进项目中并重新编译。可不可以让它们只被编译一次?这样就可以大大缩短编译时间了。事实上确实可以,我们可以通过预编译头文件的方式做到这点。
以VS2019为例,进行自定义预编译头只需要三步:
- 创建文件:将希望预编译的头文件都包含到一个头文件中,这里我们将它命名为mypch.h(pch: pre-compiled header);再新建一个cpp文件,命名为mypch.cpp,在其中包含mypch.h。
- 设置属性:在mypch.cpp的属性页中,找到C/C++ -> 预编译头,预编译头选择“创建(/Yc)”,预编译头文件填写我们刚刚创建的mypch.h。在项目的属性页中按照2中方法找到预编译头,预编译头选择“使用(/Yu)”,预编译头文件填写mypch.h。
- 在项目的每个cpp文件的最开始加上
#include "mypch.h"
。
这就搞定了。然后就可以多次更改、编译项目测试编译时长看看效果如何,越是头文件多的项目速度提升会越明显。
但是,把所有头文件都进行预编译并不意味着优化,相反,这可能拖慢编译速度。预编译头之所以可以大幅缩短编译时间,在于它提前将一部分头文件编译好了,因此当你按下“Ctrl+B”后需要进行的工作就少了许多。但是,如果预编译头文件中的某个文件的内容进行了更改的话(或许只是在某个头文件里加了个空行),那么预编译头文件中的所有文件都要进行重新编译。
因此,只将不常变动的头文件放进预编译头中,比如标准库、STL或其他第三方库,自己写的头文件最好不要放进去。