【发布时间】:2011-11-28 04:31:35
【问题描述】:
我一直在使用预编译头文件,并被告知(并看到)它们如何减少编译时间。但我真的很想知道发生了什么(在幕后),这样可以加快我的编译速度。
因为据我所知,在 .cpp 中添加未使用的包含会减慢编译时间,并且头文件可以包含大量未使用的 .cpp 头。
那么预编译的头文件如何让我的编译更快?
【问题讨论】:
标签: c++ compiler-construction compilation precompiled-headers
我一直在使用预编译头文件,并被告知(并看到)它们如何减少编译时间。但我真的很想知道发生了什么(在幕后),这样可以加快我的编译速度。
因为据我所知,在 .cpp 中添加未使用的包含会减慢编译时间,并且头文件可以包含大量未使用的 .cpp 头。
那么预编译的头文件如何让我的编译更快?
【问题讨论】:
标签: c++ compiler-construction compilation precompiled-headers
来自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 代码完全支配了编译时间。因此,您可以采取任何措施来减少这种情况,这将是有益的。您可以自己查看允许您禁用预处理的编译器:比较使用和不使用预处理的完整系统构建的时间。
【讨论】:
我认为“预编译”说明了它如何使编译更快。您可以在这里阅读我认为的基本概念:
【讨论】: