c++ - 项目中的每个 C++ 头文件都作为预编译头文件

标签 c++ compilation precompiled-headers

通常的方法是在包含最常见包含内容的项目中拥有一个预编译 header 。

问题是,它要么太小,要么太大。当它太小时,它不会覆盖所有使用的 header ,因此必须在每个模块中一遍又一遍地处理这些 header 。当它太大时,它会大大减慢编译速度,原因有两个:

  1. 当您更改预编译 header 中包含的 header 中的某些内容时,项目需要经常重新编译。
  2. 预编译头太大,因此将其包含在每个文件中实际上会减慢编译速度。

如果我预编译项目中的所有头文件会怎样?这会增加一些额外的编译器工作来预编译它们,但是这样会很好地工作,因为不需要处理两次 header (即使准备预编译 header 也会递归地使用预编译 header ),也不需要将额外的东西放入模块,并且只有实际需要重新编译的模块才会被重新编译。换句话说,对于额外的工作 O(N) 复杂度,我会(理论上)优化 C++ 包含的 O(n^2) 复杂度。预编译到 O(N) 后,预编译数据的处理仍然是 O(N^2),但至少最小化了。

有人试过这个吗?它可以缩短现实生活场景中的编译时间吗?

最佳答案

GCC ,使用预编译头文件的可靠方法是拥有一个(大)头文件(其中 #include-s 许多标准头文件...),并且可能包含一些 header 位于预编译 header 之后。

参见this answer以获得更详细的解释(特别是针对 GCC)。

关于c++ - 项目中的每个 C++ 头文件都作为预编译头文件,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/34199127/

相关文章:

c++ - 'printf' 与 C++ 中的 'cout'

c++ - std::async 函数串行运行

c++ - 在c++中强制转换是否改变变量,或者只告诉编译器它可以

g++ - 为什么g++找不到-I include-path中的预编译头?

c++ - Visual Studio 使用 vc90.pdb 做什么?

c++ - string_view 和 basic_string<char> 有什么联系,为什么 string_view 示例代码不起作用?

c++ - 如何:Boost::asio 的客户端连接管理器?

asp.net - 从 ASP.NET 网站编译代码

c++ - 编译器是否使用 C 预处理器输出中的行标记?

ios - 如果使用的方法在最低支持版本上不可用,iOS 中的宏会发出警告