當某些C++實體(如結構,類或函數)被聲明爲模板時,爲所述實體提供的定義僅爲必須實例化的藍色打印。C++模板:模板實例是內聯的嗎?性能有缺點嗎?
由於模板實體必須在聲明時定義(通常是頭文件),所以我有這個概念,我試圖說服自己是錯的,當模板實例化後,它會由編譯器內聯。我想問問這是否是這樣?
此question的答案引起了我的懷疑,當我讀到的段落:
「模板可導致慢編譯時間和可能更大 可執行文件,尤其是年紀較大的編譯器。」
由於模板必須實例化,但爲什麼「可能更大的可執行文件」更慢,編譯時間更慢?這應該以什麼方式解釋?我應該把它解釋爲'許多函數是內聯的',或者'如果有很多模板實例化,可執行文件的大小就會增加,這就是同一個模板被很多不同的類型實例化,這會導致同一個實體的多個副本出現' ?
在後一種情況下,較大的可執行文件大小是否會導致軟件運行速度較慢,因爲需要將更多代碼加載到內存中,這會導致代價很高的分頁?
此外,由於這些問題也有些依賴於編譯器,所以我對Visual C++編譯器感興趣。關於大多數編譯器所做的一般性回答也提供了良好的洞察力。
預先感謝您。
您可以擁有更多代碼的一個原因是每個模板類型都是它自己的類型。所以你所有的'Foo'的代碼必須重複'Foo ' –
NathanOliver
@NathanOliver好吧,正如我現在所瞭解的,最新的鏈接器實現(g ++ 5.x)能夠合併相同的生成的實例化代碼。 –
@πάνταῥεῖ你能提供一個鏈接嗎?這聽起來很有趣。 – bolov