我已经使用预编译头有一段时间了,并且被告知(并看到)它们如何减少编译时间。但我真的很想知道(在幕后)发生了什么,这样它可以使我的编译更快。
因为据我所知,在 .cpp 中添加未使用的 include 会减慢编译时间,并且头文件可能会在 .cpp 中包含大量未使用的标头。
那么预编译头如何让我的编译速度更快呢?
来自 http://gamesfromwithin.com/the-care-and-feeding-of-pre-compiled-headers 谢谢(@Pablo)
C++编译器在一个编译单元(cpp文件)上运行 时间。对于每个文件,它应用预处理器(它负责 完成所有包含并将它们“烘焙”到 cpp 文件本身中), 然后它编译模块本身。继续下一个 cpp 文件, 冲洗并重复。显然,如果多个文件包含同一组 昂贵的头文件(大和/或包括许多其他头文件 反过来),编译器将做很多重复的工作。
将预编译头视为一个缓存 头文件。编译器可以一次分析一组头文件,编译 他们,然后为任何需要它们的模块准备好结果。
基本上,对于包含该头文件的每个翻译单元(
.cpp
文件),都会编译一次头文件。 使用预编译头文件头可以节省反复编译包含文件的时间。 当要预编译的头文件非常大(或间接包含许多其他头文件)时,这确实很有用。
很多年前,我可以使用 C 编译器,它可以打印出它处理的行数(Watcom C 版本 6 左右)。编译少于 100 行 C 代码的文件将显示 5,000 行甚至 10,000 行的计数。所有这些都#included。换句话说,#included 代码完全支配了编译时间。因此,任何可以减少这种情况的事情都会是有益的。您可以亲自查看允许您禁用预处理的编译器:比较使用和不使用预处理的完整系统构建的时间。
我认为“预编译”说明了它如何使编译更快。我认为您可以在这里阅读基本概念: