C++ 每个C++;项目中作为预编译标头的标头
通常的方法是在包含最常见的include的项目中有一个预编译头 问题是,它要么太小,要么太大。当它太小时,它不会覆盖所有使用过的标题,因此必须在每个模块中反复处理这些标题。当它太大时,编译速度会太慢,原因有两个:C++ 每个C++;项目中作为预编译标头的标头,c++,compilation,precompiled-headers,C++,Compilation,Precompiled Headers,通常的方法是在包含最常见的include的项目中有一个预编译头 问题是,它要么太小,要么太大。当它太小时,它不会覆盖所有使用过的标题,因此必须在每个模块中反复处理这些标题。当它太大时,编译速度会太慢,原因有两个: 当您更改预编译头中包含的头中的某些内容时,需要经常重新编译项目 预编译头太大,因此在每个文件中都包含它实际上会降低编译速度 如果我预先编译了项目中的所有头文件会怎么样。这将增加一些额外的编译器工作来预编译它们,但这样会非常好地工作,因为没有头需要处理两次(即使准备预编译头也会递归地使用
请参阅以获得更详细的解释(具体针对GCC)。我自己使用GCC和带有预编译头的Clang的经验是,每次编译只能提供一个预编译头。另见,我引述: 只有当以下条件适用时,才能使用预编译头文件:
- 在特定编译中只能使用一个预编译头
- 只需读取1个文件,而不必读取更多文件,这样可以提高磁盘访问能力
- 读取针对读取而不是纯文本进行优化的二进制格式
- 它不需要执行所有的错误检查,因为这在创建时就已经完成了
t
将是什么。你可以用一堆类型来预编译它,但是哪些类型呢?我希望每个非平凡的头#都包含一些STL头,这使得这种方法不可行。文本包含文件将以内部二进制格式进行处理和准备,以供编译器稍后使用。模板显然需要再次编译,但至少文件不需要再次进行预处理。那么有什么好处呢?我不认为内部二进制格式的处理速度会明显快于标头本身,而且昂贵的优化步骤仍然需要重做。此外,您也不会删除相同类型的头文件的冗余重新编译。在每个TU中包含每个.h文件不太可能有效率。不仅仅是因为名称空间的污染,每一个微小的更改都会重新编译所有内容。当您有很少更改或从不更改的大型头时,预编译头非常有用。就像操作系统、框架、实用程序库一样。是的,我知道使用预编译头的标准方法,但这无助于在项目中重复处理头。