如Virtual functions and performance - C++中所述,虛擬方法可能會影響性能(vtable中的額外查找,不內聯......)。虛擬方法使應用程序變慢,但它們可以加速鏈接嗎?
但我想知道,虛擬功能的使用可以加快鏈接過程嗎?
假設我有一個類X,調用類Y.
- 的方法,如果該方法是一種非虛方法,然後
- 編譯器來查找方法類Y來查看它是否有效,以及如何將該調用轉換爲程序集
- 鏈接器必須在類Y中找到該方法,並用調用方法的地址替換編譯器生成的程序集中的調用地址。
- 如果該方法是一個虛擬的方法,然後
- 編譯器也將查找在Y類的方法,並具有查找Y類的虛函數表來構建調用(使用在虛函數表的偏移量)
- 接頭具有什麼都不做了
在我看來,使用虛擬方法時,鏈接器不會做太多了,和療法之前它會更快(雖然我認爲差異會很小)。
這是真的嗎?有人有這方面的經驗嗎?這是否經過測試?
鏈接時間是否真的很重要? – 2010-06-24 08:57:26
@大衛,有時。如果應用程序變得非常大(並且你不想或不能在多個DLL中分割它),鏈接可能變得非常慢。編譯可以很容易地分佈在一個集羣上(例如使用Incredibuild),但鏈接不能傳播,因此這成爲緩慢的瓶頸。但說實話,我不希望只有使用虛擬方法時鏈接纔會改善超過幾個百分點。 – Patrick 2010-06-24 09:12:28
看到我的回答關於鏈接和動態鏈接的「一次性」成本。如果你喜歡,你可以認爲它是一個O(1)成本鏈接,或O(n)在運行時。 – 2010-06-24 09:29:15