通常的方法是在包含最常见包含内容的项目中拥有一个预编译 header 。
问题是,它要么太小,要么太大。当它太小时,它不会覆盖所有使用的 header ,因此必须在每个模块中一遍又一遍地处理这些 header 。当它太大时,它会大大减慢编译速度,原因有两个:
- 当您更改预编译 header 中包含的 header 中的某些内容时,项目需要经常重新编译。
- 预编译头太大,因此将其包含在每个文件中实际上会减慢编译速度。
如果我预编译项目中的所有头文件会怎样?这会增加一些额外的编译器工作来预编译它们,但是这样会很好地工作,因为不需要处理两次 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/