2011-04-22 63 views
1

我正在使用C++作爲中間語言,爲每個函數對象創建一個具有調用方法的獨特類。我正在避免的是檢查是否已經使用了一個類似的函數,並且定義了相應的類,所以我最終可能會得到完全相同的類,並且名稱不同。所以我想知道如果編譯器(g ++)會檢測到這個併合並類。編譯器優化重複類

回答

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++類中的函數。