我刚开始接触预编译头文件,不确定应该包含哪些内容。我们的项目有大约200个源文件。
那么,我是不是需要包含所有第三方库?
如果我在三个源文件中使用了一个映射表,我需要将其添加进去吗?如果我只在一个源文件中使用了它,我需要添加吗?我需要删除旧的直接包含吗?或者条件编译和 pragma once 指令仍然有效吗?
有没有第三方库你不会添加进去?
预编译头文件会变得非常庞大,对吗?
也就是说,突然之间在所有地方都包含这些头文件,即使是预编译形式,也会产生额外负担,对吗?
编辑:
我在clang上找到了一些信息:
预编译头文件实现可以提高性能的情况:
- 加载PCH文件的速度比重新解析存储在PCH文件中的头文件束更快。因此,预编译头文件设计试图将读取PCH文件的成本最小化。理想情况下,这个成本不应该随着预编译头文件大小的变化而变化。
- 生成PCH文件的成本不会太大,以至于它抵消了由于首先消除需要解析捆绑包头文件而导致的每个源文件的性能提升。这对于多核系统特别重要,因为PCH文件的生成会使所有编译序列化,需要更新PCH文件。
Clang的预编译头文件采用紧凑的磁盘表示方法,从而最小化了PCH创建时间和初始加载PCH文件所需的时间。PCH文件本身包含Clang抽象语法树和支持数据结构的序列化表示,使用与LLVM位代码文件格式相同的压缩比特流存储。
Clang的预编译头文件从磁盘“懒加载”。当首次加载PCH文件时,Clang仅读取一小部分数据来确定某些重要数据结构的存储位置。在此初始加载中读取的数据量独立于PCH文件的大小,因此更大的PCH文件不会导致更长的PCH加载时间。实际的头文件数据——宏、函数、变量、类型等——只有在从用户代码中引用它时才从PCH文件中加载,此时只有该实体(以及依赖于它的实体)会从PCH文件中反序列化。采用这种方法,使用预编译头文件进行翻译单元的成本与实际使用的头文件代码量成正比,而不是与头文件本身的大小成正比。
对我来说,这似乎表明至少在Clang上:
- 已经注意到使预编译头文件的加载时间与大小无关。
- 使用预编译头文件的时间与预编译头文件的大小无关,与使用的信息量成比例。
- 与迄今为止给出的答案相反,这似乎表明即使将外部文件(例如
<map>
)包含在其中一次,也值得将其包含在预编译头文件中(仍然可以加速该源文件的重新编译)。
必须有某种映射来映射所有信息。这个映射可能会变大,但也许这并不那么重要?不确定我是否理解正确,或者它是否适用于所有编译器...
<string>
或包含所有项目特定类型或静态变量的头文件。 - Zaiborg