39

预编译头文件的最佳候选者是什么?我可以将 STL 和 Boost 标头放在那里,即使它们有模板?这会减少编译时间吗?另外,减少编译时间的最佳 IDE 设置是什么?

4

4 回答 4

51

快速回答:STL 和 Boost 头文件确实属于预编译的头文件,即使这些头文件定义了模板类。

在生成预编译的头文件时,编译器会解析头文本(一项重要任务!),并将其转换为针对编译器进行优化的二进制格式。

即使在编译其他 .cpp 文件时会实例化模板类,它们也会从预编译头中的信息实例化,这对于编译器来说读取速度要快得多。


(后来补充)

应该包含在预编译头文件中的一件事是作为项目的一部分并且经常更改的文件,即使每个 .CPP 文件都包含这些文件。

原因是这样的——预编译头的生成可能需要很长时间,因为boost、stl和windows库都非常大。

你可能有一个所有东西都使用的简单文件(例如“StringDefs.h”)。如果 StringDefs.h 包含在 stdafx.h 中,并且一个开发人员接触了 StringDefs.h,那么每个开发人员都必须等到整个预编译头文件重新编译。如果将 StringDefs.h 排除在预编译头文件之外,并与每个 .CPP 文件一起解析,速度会快得多。

于 2009-03-27T00:40:14.583 回答
6

Andrew Shepherd 回答的一个补充。将预编译的头文件用于项目外部的头文件,用于不经常更改的文件。如果您一直在更改当前项目中的头文件,则可能不值得预编译它们。

于 2009-03-27T00:56:43.310 回答
4

I've written an article on techniques that reduce the compilation time. Among these techniques a post on precompiled header and its application can be found here. It also has a section on best practices that you may find interesting. CMake scripts that handle it transparently are included.

于 2010-02-21T18:58:26.723 回答
-1

将任何内容放在该项目中的大多数 .cpp 文件无论如何都会包含的预编译头文件中。这适用于任何头文件,真的。这允许编译器解析这些文件一次,然后在同一项目的所有 .cpp 文件中重用该信息。

于 2009-03-27T00:47:44.953 回答