2011-07-13 77 views
0

爲了加快編譯大型源文件,刪除翻譯單元中使用的頭文件的數量是否更有意義,或者編譯代碼的代價遠大於處理包含的時間守護頭?編譯器處理包含防護標頭的代價是多少?

如果後者是真實的,那麼在創建更多,更輕量級的標頭而不是更少的情況下,設計工作會更好。

因此,現代編譯器需要多長時間處理一個有效包含在內的頭部?包含這些頭文件會在什麼時候影響編譯性能?

(與this question

回答

0

答案:

它可以是非常昂貴

我發現那裏有人已經做了非常問題的一些測試在這裏解決,我驚訝地發現,你可以通過至少一個數量的順序,如果你寫增加MSVC在你的編譯時間的一篇文章你有警衛正確:

http://www.bobarcher.org/software/include/index.html

最驚人的線從結果是,2008年MSVC下編制了一份測試文件去從5.48s到給予正確包括後衛方法0.13S。

1

我讀到這樣的一個常見問題有一天......第一關,寫正確頭,即包括您使用和不依賴於無證依賴的所有頭(可能並將改變)。其次,編譯器現在通常認可包括警衛,所以他們相當有效。不過,你仍然需要打開很多文件,這可能會成爲大型項目的負擔。一個建議是要做到這一點:

頭文件

// file.hpp 

#ifndef H_FILE 
#define H_FILE 

/* ... */ 

#endif 

現在使用的頭在你的源文件,添加一個額外的#ifndef

// source.cpp 

#ifndef H_FILE 
# include <file.hpp> 
#endif 

這將是在嘈雜的源文件,並且您需要可預測的包含保護名稱,但是您可能會避免許多包含這樣的include指令。

+0

你必須至少打開頭文件一次,所以如果編譯器很快檢測到包含守護程序,你會得到什麼? –

+0

@yi_H:第二個代碼塊進入源文件(我編輯它)。重點是如果'file.hpp'已經包含在內,你永遠不需要_open_'file.hpp'來找到它的包含後衛。 –

+0

我不知道編譯器是如何工作的,但是如果我寫了一個,我會在標誌中存儲標題是否被保護,如果是這樣,常量仍然定義,那麼不需要再打開幷包含它。編譯器使用這種機制嗎?如果是這樣,那麼所有額外提議的警衛都毫無意義。 –

1

假設C/C++,對於大型系統(數百個文件),頭文件的簡單重新編譯非線性縮放,所以如果編譯性能出現問題,那很可能就是這樣。至少除非你想在80年代的PC上編譯一百萬行的源文件...

大多數編譯器都可以使用預編譯頭文件,但通常需要特定的配置和管理才能在非系統頭文件上工作,這不是每個項目都做的。

見例如:

http://www.cygnus-software.com/papers/precompiledheaders.html

'建造時間對我的項目現在是它以前的15%!'

除此之外,你需要看技術在:

http://www.amazon.com/exec/obidos/ASIN/0201633620/qid%3D990165010/002-0139320-7720029

或系統分成它們之間乾淨,非基於頭接口多個部分,說.NET組件。

+0

我最近發現了PCH(與Boost戰鬥時),我喜歡它們,但當被問及這個話題時,我收到很多人的負面反應...... –