我正在使用C++作爲中間語言,爲每個函數對象創建一個具有調用方法的獨特類。我正在避免的是檢查是否已經使用了一個類似的函數,並且定義了相應的類,所以我最終可能會得到完全相同的類,並且名稱不同。所以我想知道如果編譯器(g ++)會檢測到這個併合並類。編譯器優化重複類
Q
編譯器優化重複類
1
A
回答
2
只是爲了澄清兩個以前的答案(這是很好的答案):
編譯器絕對不會合並你的類,在所有。一些連接器可能沿着這些線有一些優化,但它絕不是標準功能,標準的Microsoft和GNU/Linux連接器都沒有這樣做。通常情況下,鏈接器只會這樣做,如果您直接在目標文件中發出具有相同名稱的弱條目,這就是模板實例化所發生的情況。雖然至少GCC提供了擴展來自己控制這種鏈接,但沒有直接在C/C++中獲得這種行爲的標準方法。
你應該自己做,因爲它實際上是一種優化。賈森是正確的,它會「減少」代碼大小,但在現代PC架構上本身就是一個巨大的優化。 CPU上的代碼緩存沒有變得更大,內存速度也無法接近CPU速度,因此,由於代碼圖像過大導致緩存未命中可能會對性能造成嚴重影響。有一些基準測試顯示,編譯Linux內核或諸如Firefox或OpenOffice等大型應用程序時,使用-Os(優化大小)在某些工作負載中的編譯速度要比使用-O3編譯時大幅度提高。
0
我懷疑它會。這在一般情況下很難檢測到,並且在優化時沒有運行效率。唯一的節省是代碼空間。優化鏈接器可能會執行這樣的轉換,但這些轉換器在野外很少見。
1
不,至少g ++不會,因爲一個類定義了一個名稱空間,因此即使函數本身具有相同的名稱,class A
中的函數實際上也不會與class B
中的函數相同。例如,A::foo()
與B::foo()
不一樣。
而且編譯後生成的目標文件中的函數名是錯位的,所以A::foo()
不會有相同的文字名稱B::foo()
即使是在編譯的目標文件級別沒有命名空間的抽象。所以鏈接器不能根據它們的名字去除兩個不同C++類中的函數。
相關問題
- 1. 編譯器優化
- 2. 編譯器優化
- 3. 各種類型的編譯器優化?
- 4. JVM JIT編譯器如何優化「重複」Java代碼?
- 5. 重複訪問者調用的編譯器優化
- 6. 編譯器會自動優化重複代碼嗎?
- 7. GNU編譯器優化
- 8. C++編譯器優化
- 9. 編譯器優化實現
- 10. PHP編譯器優化
- 11. 編譯器謂語優化
- 12. 優化css編譯器
- 13. Requirejs優化器不編譯
- 14. 克++編譯器的優化
- 15. Java編譯器優化
- 16. 編譯器優化問題
- 17. 二郎編譯器優化
- 18. 編譯優化複製構建?
- 19. Webpack - 優化編譯時間(熱重載)
- 20. 是由編譯器優化的類上的硬編碼數組?
- 21. CLR語言優化。語言編譯器VS JIT編譯器
- 22. Swift編譯器優化導致凍結
- 23. 對於LOOP丟掉編譯器優化
- 24. VB.NET Select Case編譯器優化?
- 25. 編譯器爲什麼不優化?
- 26. GNU GCC編譯器優化和調試
- 27. C編譯器結構優化
- 28. NetBeans IDE gcc編譯器優化選項
- 29. 函數參數的編譯器優化
- 30. 關閉編譯器選擇性優化?