预编译标准库头文件 - C++

Posted

技术标签:

【中文标题】预编译标准库头文件 - C++【英文标题】:Precompiling standard library header files - C++ 【发布时间】:2009-11-14 18:41:52 【问题描述】:

在我的项目中,不同的文件中使用了几个 STL 标头。我读到了,将所有这些头文件放在一个头文件中并在我的文件中使用该头文件将允许编译器预编译头文件,这可能会导致更快的编译时间。

如果我理解正确,我需要像下面这样写。

// stl.hpp
#include <string>
#include <algorithm>
#include <vector>

现在在所有需要访问 STL 的文件中包含 stl.hpp。这是正确的吗?

我的一些文件将仅使用 vector 头文件中的功能。但是如果我按照上述方法,它将包含不必要的标题。这会有什么问题吗?如果我包含一个头文件并且没有使用其中的任何内容,是否会生成任何代码?

任何帮助都会很棒!

【问题讨论】:

我对将所有头文件包含在单个头文件中会导致编译时间更快的说法高度怀疑。 C++ Templates - The complete guide 说,确实如此。不过我不确定。 编译计时很简单,试一试看看有没有明显改善。 stl.hpp 可能是用词不当。 &lt;string&gt; 是否是 STL 的一部分至少是有争议的。 (注:STL 是一个容器/迭代器/算法库,由 Alexander Stepanov 开发。在此之前,它被并入了 C++ 标准库草案,将 C++98 的标准化推迟了大约一年。虽然在做所以,语言和库的其余部分都被扩展了,STL 也被改变了,这样它们就可以更好地结合在一起。其中,std::basic_string 得到了一个容器接口,扩展的模板,以及采用的 STL 使用扩展模板。) @Charles 在单个头文件中包含头文件并不能加快编译速度。加快速度的是所有预编译的标头都被扫描和编译一次,并且在后续构建期间不再查看(假设它们在此期间没有更改)。根据项目中头文件的数量和大小,这可以显着提高速度。 【参考方案1】:

基本上每个体面的编译器都使用precompiled headers。已经编译的头文件将被缓存并且只有在它们被改变时才会重新编译

使用已经编译的头文件而不是每次都重新编译它们会加快编译时间。

但是,无论是在单个文件中组合常用的头文件还是将它们分别包含在每个源文件中,在编译速度方面都无关紧要。

【讨论】:

【参考方案2】:

在尝试使用预编译的标头加速构建之前,值得对现有构建进行基准测试/计时,看看加速是否值得。

如果您只有几十个带有#include &lt;string&gt; 的文件,您可能看不到任何改进。如果您有 1000 个文件,那么它可能是值得的。

查看这篇文章了解更多信息:www.cygnus-software.com

【讨论】:

以上是关于预编译标准库头文件 - C++的主要内容,如果未能解决你的问题,请参考以下文章

头文件带和不带.h的区别

第7讲——函数初步

有 C++ 标准库 ifdef 或 ifndef 预处理器指令吗?

是否有任何标准的包含顺序以避免隐藏的依赖关系? [复制]

C++语法小记---标准库

c++多线程编程:实现标准库accumulate函数的并行计算版本