视频内容
刚开始我以为up就是想把所有的系统级头文件合并在一个.h里然后引用,还在想这有什么意义,好看一点?
看到改CMake直接使用了一个pchheader才知道,这里有东西的!!
预编译的头文件
PCH文件是一个预编译头文件(pre-compiled header),它的后缀是PCH,所以也叫PCH文件。编译器会将头文件的内容事先编译成二进制的中间文件,在整个编译过程中,只编译一次,并且有缓存,除非有变化,否则不会重新编译(每个引入的.h和.cpp)文件,从而大大提高编译速度。
每个源文件只能使用一个预编译的标头(.pch)文件,但是可以在一个项目中使用多个.pch文件。
几乎所有C/C++编译器都支持预编译头文件的,例如gcc, clang, msvc等…但是不同的编译器对它的支持力度和处理方式有很大差异,并不是非常通用。
msvc的处理
/Yc是创建pch文件,必须要通过编译stdafx.cpp才能生成stdafx.pch,使用的时候需要用/Yu来使用,最后链接的时候还需要把stdafx.obj和test.obj都链接上才行,这也是和gcc, clang最大的不同。
其他
clang的支持很简单,可以直接通过-c创建,使用的时候通过-include-pch直接使用。
gcc不支持-include-pch,所以需要从-I的头文件路径中搜索。
标头单元、模块和预编译头文件
如微软的文档里所描述的,include是最慢的,其次是预编译头,再快一点的是标头单元,而最快的是模块。
import std
或者import std.compat
的速度比#include <vector>
要快,不过目前好像只有msvc支持完整,clang到17还是部分支持。
那说回来,什么是标头单元?
标头单元是头文件的二进制表示形式。 标头单元以 .ifc 扩展名结尾。相同的格式也用于命名模块。
使用标头单元比include编译要快的主要原因就是标头单元类似于预编译头文件一样,是提前被编译过的,而且标头单元是不受外部宏定义影响的,因为已经被编译过了。
不过标准库的标头文件,现在看支持好像还是一般,以mvsc为主。
参考
https://tboox.org/cn/2017/07/31/precompiled-header/
https://learn.microsoft.com/zh-cn/cpp/build/compare-inclusion-methods?view=msvc-170
End。