2016-07-29 49 views
2

我已經使用C++進行了很長一段時間的編程,我很喜歡使用模板。我最近因爲進入嵌入式編程而一直在想的是,在模板參數不同的模板實例中,鏈接器應該如何處理代碼重複。鏈接器通常會優化掉不同C++模板實例中的重複代碼嗎?

對於這個衆所周知在鏈接時被優化掉相同的參數相同的模板的多個實例(參見:How does C++ link template instances

但是在我的情況,我有興趣,如果連接器將識別任何複製兩個模板之間用不同參數實例化的代碼。因爲它們是不同的類型,我會假設它們不會自動摺疊。然而,由於它們可能有一些函數不依賴於模板參數,因此在兩個類之間會相同,人們可能會認爲鏈接器可以優化這些函數,從而節省空間。

這種情況下的預期行爲是什麼?

+0

你試過godbolt了嗎? – lorro

+0

是的,看例如:https://godbolt.org/g/jbx2ms但是,只有編譯器,據我所知,而不是鏈接器。底部有相同的代碼,鏈接器可以將其優化掉,但我不知道它通常會如何。 – Blackclaws

回答

5

黃金鍊接器就是這麼做的。

Safe ICF: Pointer Safe and Unwinding Aware Identical Code Folding in Gold

我們已發現,大C++應用程序和共享庫往往有許多功能,其代碼是與另一種功能是相同的。通過將這些相同的功能合併爲一個副本,理論上可以消除多達10%的代碼。這種優化,相同的代碼摺疊(ICF),已經在黃金鍊接器中實現。在鏈接時,ICF使用相同的目標代碼檢​​測函數,並將它們合併爲一個副本。

+0

看起來不錯。它也顯示gcc有一個選項,可以在鏈接https://gcc.gnu.org/onlinedocs/gcc/Optimize-Options.html時做到這一點,但是他們聲明有些東西只有黃金連接,而有些東西只能連接到gcc – Blackclaws

+0

@Blackclaws自2011年以來,我一直在使用gold鏈接器,我喜歡它比舊的'ld'連接快幾倍,並且還有一個很好的功能'-detect-odr-violations'。 –