2012-12-09 64 views
1

在構建一個不斷增長的類/函數庫時,我通常會看到一種「傘」頭文件,它包含項目的所有常見頭文件。例如:C++編譯器是否對未使用的#includes進行了優化?

dsp.h 
#include "file1.h" 
#include "file2.h" 
... 
#include "filex.h" 

有時我可能需要一切,但其他時間可能只有一些功能/選項。如果#include dsp.h,但不使用file2.h中的任何內容,編譯器是否知道?它有可能在構建中優化它嗎?

否則,我的解決方案是將可選代碼包裝在預處理指令中,然後定義我需要的。也許這是一個更安全,更有效的解決方案?

回答

4

您是在談論代碼優化還是編譯時優化?

不必要的,未使用的標頭不會更改正在生成的代碼,因此這裏沒有優化問題。

但是,它會增加構建時間。這不是通過構建工具進行優化的。如果您希望優化編譯時間,請參閱大型C++軟件設計作者:John Lakos

+0

我正在談論代碼優化,而不是編譯時間。基本上,如果包含的頭文件未被使用,是否仍將其包含在構建的可執行文件中,從而增加代碼大小? – Chris

+0

@Chris - 不,它不會增加代碼大小。 – user93353

+0

@ user93353如果不知道頭文件的代碼,則無法做出該決定。 –

1

由於預處理器是C++編譯器的獨立程序(和語言),所以預處理器無法知道使用的是什麼。所以編譯器會收到頭文件中的所有內容。

3

預處理器不做任何優化。它不知道任何有關代碼的語義,因此無法分辨是否使用頭文件中的任何內容。所以不,#include語句沒有優化。

0

包含文件被讀取,並在編譯器真正開始生成代碼之前被插入源代碼的一部分。

是的。作爲一般規則,程序未引用的內容不會放入最終的可執行文件中。可以認爲這是一種優化。細節將根據編譯器和鏈接器而有所不同。

相關問題