2010-07-27 55 views

回答

5

他們應該縮短光源尺寸(如果重複使用它們),但不是二進制大小(模板編譯爲每個不同的實例)。

這不同於Java泛型,其中有一個完整類型的擦除(泛型只用作類型的編譯時驗證)或C#,泛型被編譯成特定的二進制文件,可以直接重用,無需重新編譯和生成更多的代碼。

0

的二進制文件的大小取決於你的編譯器和optimasations編譯器將執行elimnating redandant代碼來減少代碼大小。

現代編譯器能夠檢測冗餘代碼,使二進制文件的大小將不會被使用模板dramaticly增加。

+0

我懷疑編譯器可以對模板做任何事情,而不是使用非模板化函數。模板具有外部鏈接,因此它們不能從目標文件中刪除,並且可以使用任何技術來減少模板的內部代碼,這些技術也將用於非模板代碼。 – 2010-07-27 08:17:42

2

我的理解是,每次與模板實例類型的編譯器產生的相關類,以匹配型 - 因此,如果您使用List<int>List<foo>List<float>則實際上是三個不同List類在遵守二進制。

編輯:
我什麼都沒有明確說明的是,我推斷合併到一個單一的模板幾類將(可能)不會降低你的二進制文件的大小,但應減少的尺寸你的來源。

+1

你的理解是好的,並且注意到(除非你手動實例化類),只有那些實際使用的方法纔會被編譯。由於鏈接程序可以從二進制文件中刪除未使用的代碼,因此我沒有將其添加到我的答案中,因此類似的空間優化可用於非模板代碼,這沒有什麼差別。 +1 – 2010-07-27 08:22:26

0

模板一定會成爲編寫更通用和更短代碼的一種方式。您不必編寫函數n來處理不同類型的參數,而是使用參數的通用類型編寫一次。

關於二進制大小,代碼會爲你做的模板實例產生,也就是說,當你指定一個類型。我不明白它會如何縮短二進制大小。

2

這取決於...如果你要實現每種類型都有一個單獨的類,那麼源代碼的大小將減小。

作爲二進制則很可能將不會看到任何顯著差異,因爲如果你要實現單獨的類,每種類型而你沒有,因爲你已經使用的模板,這並不意味着該二進制文件的大小將減少,因爲代碼將由編譯器生成(用於實例化),所以您不能有任何顯着差異,因爲「代碼與相同」。

相關問題