2009-10-21 103 views
3

在编译期间在包含头文件或C++源文件中的文件方面与编译时的性能有什么区别?头文件/源文件中包含的文件

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

一个(标题)影响编译时间,另一个(源文件)影响链接时间吗?

回答

1

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

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

1

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

12

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

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

限制标题包括声明类所需的标头是一种很好的做法。除了限制包括在类中使用的类型之外,还可以使用前向声明来替代仅包含指针或引用在类接口中使用的类型的包含。

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

1

过去,人们只会从源文件(.cpp/other extensions)中包含头文件来减少编译时间,否则会产生级联头文件。现在这不是一个问题了,而且包括他们真正需要的报头(甚至其他标题)可以避免你必须每次在您的来源很多头...

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

2

正如亚当所写,包括头中的标题会使您的编译单位变大,这会降低性能。但是这只在大型项目中很明显。这对于OS标题非常重要,例如<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; 
    ... 
} 

这将不再需要。即使对于较小的项目,这也可以产生显着的差异。