說你#include並且從不使用stdio.h中的任何東西。與此相關的開銷成本是多少?C中#include的代價#
我注意到很多網絡代碼包含了所有網絡相關的頭文件,他們可以想到這些頭文件以防他們最終使用其中的某個頭文件,所以我想知道這是否是某種易用性與效率之間的折衷或如果沒有效率的損失。
說你#include並且從不使用stdio.h中的任何東西。與此相關的開銷成本是多少?C中#include的代價#
我注意到很多網絡代碼包含了所有網絡相關的頭文件,他們可以想到這些頭文件以防他們最終使用其中的某個頭文件,所以我想知道這是否是某種易用性與效率之間的折衷或如果沒有效率的損失。
編譯時間開銷,主要是因爲編譯器必須包含並解析該文件。
包含不需要的文件會導致編譯時間稍微增加,但對生成的代碼沒有影響。
它只會影響編譯速度,而不會影響執行速度。至於編譯時間的開銷,對於大型項目來說可能會很明顯,但知道它如何影響你的項目的唯一方法是測量編譯時間和不編譯時間。
沒有運行效率損失。這更多的是維護問題,因爲具有多餘內容會導致您不清楚實際使用的庫。
Precompiled headers現在最流行的編譯器使包含成本由#include
幾乎可以忽略不計。在運行時,沒有任何事情會發生,因爲鏈接器足夠聰明,不會包含那些不需要的東西。
任何開銷將主要在編譯時而不是運行時。
#include
告訴編譯器,它需要包含引用文件中的代碼。所以它必須在文件遇到引用時加載文件。這將花費有限的時間,具體取決於文件的實際位置以及文件的大小。
運行時唯一的開銷是如果編譯器包含未被引用的代碼,從而使可執行文件比需要的更大 - 這可能會增加啓動時間。
一般來說,有只有編譯時間開銷而不是運行時間開銷。鏈接器只會鏈接到您的程序使用的使用的的部分庫。不好的鏈接器將包含引用庫的加載代碼,即使它們根本沒有被使用,所以你在啓動時花費很少。
當然,它減慢了編譯的速度。在一般情況下,它也可能導致你的.exe包含全局變量,甚至你永遠不會使用的函數。
對於標準的C運行時頭文件,我不知道任何重要的運行時成本。對於其他標題,你需要小心。某些Windows頭文件聲明瞭數百個UUID,這些UUID最終可能會導致您的exe文件膨脹。
您在運行時查看是否花費任何東西的方式是查看鏈接器生成的.map文件。那裏有沒有你期望的變量或函數?
我懷疑任何現代連接器都會包含你從不使用的全局名稱。 – 2009-12-26 20:39:30
@Chris--我希望這是真的。但是「使用」對於人來說意味着與連接器不同的東西。連接器無法真正說出與「引用」之間的區別。對於頭文件來說,你並不真正使用' '把'extern int _foobar;'放在一個頭文件中,看看會發生什麼。 – 2009-12-26 21:50:07
有時候複雜包括讓編譯時間嚴重不好。 – sevity 2009-12-26 19:45:17
@sevity - 通常使用C++,其中include包含大量的代碼和模板以及多毛的東西。 C包括實際上只能變得非常複雜,特別是像''這樣的標準頭文件不會不必要地低效。 –
2009-12-26 20:37:32