头/源文件中包含的文件

时间:2009-10-21 20:17:32

标签: c++ performance compilation

在编译期间,在头文件中包含文件或在C ++中包含源文件有什么区别?

在源文件中而不是在头文件中包含文件的原因是什么(绝对需要时除外)?

一个(标题)是否影响编译时间而另一个(源文件)是否会影响链接时间?

5 个答案:

答案 0 :(得分:12)

当您在任一地方包含文件时,您可以将其视为在文件中展开,然后必须由预处理器和编译器处理。

当您在标题中包含某些内容时,包含标题的每个客户端都会继承这些内容。因此,不必要地在头文件中包含文件有可能扩展多个翻译单元,这会对性能产生负面影响。

优良作法是将标头包含限制为声明该类所需的标头。除了限制包含在类中使用的那些类型之外,您还可以使用前向声明来代替包含仅用于通过指针或引用在类接口中使用的类型。

根据我的经验,这种性能影响通常不明显。它可能会在非常大的项目或广泛使用的标题中发挥作用。

答案 1 :(得分:2)

正如Adam所写的那样,在标题中包含标题会使您的编译单元变大,从而降低性能。但这只在大型项目中才会引起注意。这对于操作系统标头非常重要,例如<windows.h>。这就是为什么已经发明了预编译头文件和WIN32_LEAN_AND_MEAN的原因。

但如果在其他标头中不必要地包含标头,则会出现另一个构建性能问题:如果标头更改,则可能需要重建更多。

考虑:

// A.h
class A
{
    ...
}

// B.h
#include "A.h"
class B
{
    A *_a;
    ...
}

如果更改A.h,IDE将重新编译包含B.h的源,即使他们不使用类A。但是,如果您将B.h更改为:

// B.h
class A; // forward declaration, declared in "A.h"
class B
{
    A *_a;
    ...
}

这将不再是必要的。即使对于较小的项目,这也会产生明显的差异。

答案 2 :(得分:1)

对于任何表现问题,真正的答案是自己衡量 - 你的环境会与其他人不同。

对于这种情况,我猜它应该是相同的,除非涉及预编译头 - 如果它们是,那么如果include在预编译中那么它会更快,因为它只被编译一次。

答案 3 :(得分:1)

正如马克所说,在你的环境中测量它。一般来说,如果将其包含在源文件中,则仅在包含和需要的位置读取。如果将它包含在头文件中,并且此头文件被很多其他源文件包含,编译时间将会增加。这也是你应该尽可能在头文件中使用前向声明而不是包含类头文件的原因。

答案 4 :(得分:1)

过去人们只包含来自源文件(.cpp /其他扩展名)的标头以减少编译时间,因为否则它会生成一系列标头。现在它不再是一个问题了,包括它们实际需要的标题(甚至是其他标题)可能会避免你每次都要在你的源代码中包含很多标题......

http://www.icce.rug.nl/documents/cplusplus/cplusplus07.html#an973(更详细的回答)