我讀過模板被編譯到不同的實體中,所以這意味着二進制文件的大小將與我們使用不同的函數編譯它一樣嗎?做模板縮短源代碼或二進制文件或兩者的大小
回答
他們應該縮短光源尺寸(如果重複使用它們),但不是二進制大小(模板編譯爲每個不同的實例)。
這不同於Java泛型,其中有一個完整類型的擦除(泛型只用作類型的編譯時驗證)或C#,泛型被編譯成特定的二進制文件,可以直接重用,無需重新編譯和生成更多的代碼。
的二進制文件的大小取決於你的編譯器和optimasations編譯器將執行elimnating redandant代碼來減少代碼大小。
現代編譯器能夠檢測冗餘代碼,使二進制文件的大小將不會被使用模板dramaticly增加。
我的理解是,每次與模板實例類型的編譯器產生的相關類,以匹配型 - 因此,如果您使用List<int>
,List<foo>
和List<float>
則實際上是三個不同List
類在遵守二進制。
編輯:
我什麼都沒有明確說明的是,我推斷合併到一個單一的模板幾類將(可能)不會降低你的二進制文件的大小,但應減少的尺寸你的來源。
你的理解是好的,並且注意到(除非你手動實例化類),只有那些實際使用的方法纔會被編譯。由於鏈接程序可以從二進制文件中刪除未使用的代碼,因此我沒有將其添加到我的答案中,因此類似的空間優化可用於非模板代碼,這沒有什麼差別。 +1 – 2010-07-27 08:22:26
模板一定會成爲編寫更通用和更短代碼的一種方式。您不必編寫函數n來處理不同類型的參數,而是使用參數的通用類型編寫一次。
關於二進制大小,代碼會爲你做的模板實例產生,也就是說,當你指定一個類型。我不明白它會如何縮短二進制大小。
這取決於...如果你要實現每種類型都有一個單獨的類,那麼源代碼的大小將減小。
作爲二進制則很可能將不會看到任何顯著差異,因爲如果你要實現單獨的類,每種類型而你沒有,因爲你已經使用的模板,這並不意味着該二進制文件的大小將減少,因爲代碼將由編譯器生成(用於實例化),所以您不能有任何顯着差異,因爲「代碼與相同」。
- 1. C++模板 - 代碼的用法,二進制的大小
- 2. 縮短或拆分代碼
- 3. 'code = sm_X'是否只嵌入了二進制(cubin)代碼或PTX代碼,或者兩者都嵌入?
- 4. 壓縮不包含二進制文件的源代碼
- 5. JVM編譯類文件到彙編源代碼或二進制代碼
- 6. 網站源代碼控制和大設置二進制文件
- 7. 二進制文件大小
- 8. 二進制模板文件
- 9. 簡化或縮減代碼大小
- 10. haxe cpp - 如何將大型文本或二進制資源嵌入代碼?
- 11. 如何縮短或更改此代碼?
- 12. 自動縮短JS的URL或者Rails
- 13. CSV或PHP中的二進制文件
- 14. 二進制文件的Git或Subversion
- 15. 源文件與二進制文件:提供兩者的目的是什麼?
- 16. 可以縮短或改進此代碼嗎?
- 17. 壓縮二進制文件
- 18. 快速信息庫或.net二進制壓縮開源庫
- 19. 調整大小SKShapeNode幀,或者替代
- 20. .aspx.cs(代碼隱藏)或BLL或兩者中的驗證碼?
- 21. 更新TFS源代碼管理中的二進制文件
- 22. 在GCC調試二進制文件中的源代碼位置
- 23. Julia BinDeps:源代碼和二進制文件之間的區別
- 24. 是否有可用於縮進的算法或源代碼?
- 25. 非連接的dat.gui源文件與require.js。定製或模板dat.gui
- 26. PHPEclipse代碼模板不正確縮進
- 27. 嵌入二進制源代碼
- 28. django二進制(無源代碼)部署
- 29. 源代碼,二進制,列表,續行
- 30. 將源代碼和二進制文件目錄傳遞給Sonar
我懷疑編譯器可以對模板做任何事情,而不是使用非模板化函數。模板具有外部鏈接,因此它們不能從目標文件中刪除,並且可以使用任何技術來減少模板的內部代碼,這些技術也將用於非模板代碼。 – 2010-07-27 08:17:42