2009-10-21 105 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; 
    ... 
} 

這將不再需要。即使對於較小的項目,這也可以產生顯着的差異。