2010-01-23 44 views
4

我注意到,當我使用增強功能時,應用程序大小往往會增加約.1 - .3 MB。這可能看起來不多,但與使用其他外部庫相比(至少對我而言)。爲什麼是這樣?爲什麼使用boost增加文件大小如此之多?

+1

Boost的哪個部分? – GManNickG 2010-01-23 03:02:41

+0

當前正在使用文件系統,lexical_cast,隨機和綁定。 – Anonymous 2010-01-23 03:07:40

+2

不要這麼快接受答案。有些人甚至沒有回答這個問題。這對dsimcha毫無意義,只是給別人一個機會。 :) – GManNickG 2010-01-23 03:09:03

回答

4

Boost使用模板無處不在。這些模板可以用相同的參數多次實例化。一個足夠聰明的鏈接器將會拋出除一個副本外的所有內容。但是,並非所有連接器都足夠聰明。另外,模板有時會隱含地實例化,甚至很難知道已經實例化了多少次。

+3

「並非所有連接器都足夠聰明」。因爲如此愚蠢以至於留下相同代碼的「多個副本」,有時也被稱爲「內聯」;-)。但是,嚴肅地說,模板比靜態庫更容易內聯。除非您將選項設置爲只在內聯時纔會增加代碼大小,否則會增加代碼大小。這甚至在任何直接的低效率之前就像重複的非線性代碼一樣。 – 2010-01-23 03:24:30

+3

您也將在每個引用每個頭文件的每個obj文件中獲得一份副本。由於大多數這些模板都是在其他模板的基礎上實現的,因此它也使用多個模板來實現多個模板。在一個大項目中,您可以輕鬆獲得成千上萬的cout模板副本。 stl和boost的實現方式,代碼無論如何都是怪異的膨脹。加上mem碎片和優化查殺發生得像瘋了一樣,因爲有這麼多func ptrs和smt ptrs。總之,不要使用boost,儘可能少地使用stl。 – 2010-01-23 04:15:31

+0

@Charles:絕對可怕的一般建議。除非你特意要降低代碼大小(這已經不再重要了),你應該儘可能地使用它們。 – GManNickG 2010-01-23 20:00:34

0

這一切都取決於它如何使用。由於Boost是一堆模板,因此會導致一堆成員函數按照使用的類型進行編譯。如果使用n類型的提升,則成員函數被定義(通過C++模板)n次,每種類型一個。

1

「這麼多」是一個比較術語,我擔心你會比較蘋果和橘子。僅僅因爲其他圖書館較小並不意味着你應該認爲Boost是一樣小的。 看看Boost爲你做的絕對量!

我懷疑製作具有相同功能的自定義庫會有任何相當小的尺寸。唯一有效的比較是「Boost的X庫」與「另一個X的庫」。不是「Boost的X庫」和「另一個Y庫的庫」。

文件系統庫功能非常強大,這意味着很多功能,還有很多後臺代碼爲您和我提供了一個簡單的界面。此外,像其他人提到的一般模板可以增加代碼大小,但它不是這樣的可以避免的事情。模板或手工編碼,無論是誰都會得到相同的尺寸代碼。唯一的區別是模板要容易得多。

-1

Boost主要由非常一般化且有時非常複雜的模板組成,這意味着類型和函數由編譯器根據需要按照用途創建,而不是簡單地通過聲明創建。換句話說,少量的源代碼可以產生大量的目標代碼來實現聲明或使用的模板的所有變體。 Boost也依賴於標準庫,並引入這些依賴關係。然而,最重要的貢獻是Boost源代碼幾乎主要存在於包含文件中。包含標準c包含文件(STL之外)通常包含非常少的源代碼,並且包含大多數原型,小宏或類型聲明而不實現它們。 Boost包含其包含文件中的大部分實現。

+0

根據我的經驗,如果你不得不使用Boost,也許你需要使用不同的語言來提供更多的內在特徵提升,例如屬性等...... Boost顯着增加了,有時幾乎達到了構建階段的癱瘓程度,一個項目的時間。 – Jordan 2016-12-19 12:23:44

相關問題