2010-04-26 70 views

回答

2

雖然比利指出這很像other post on SO,但我認爲它不完全一樣......主要是因爲這個問題措辭的方式。

因爲奧爾加談到一個「決定」,我幾乎認爲她在使用接口和使用派生類之間混淆了,並且通過dynamic_cast確定指向該對象的指針是否屬於特定類。

如果您正在討論使用dynamic_cast,那麼根據我的理解(並且這不是基於具體的性能數字),您將獲得相當顯着的性能。

如果你正在談論使用接口,那麼我覺得做一個vtable查找和額外的調用的次要攻擊遠遠勝過一個更好的軟件設計。

3

是的,但不是很重要,如果您需要接口需要的靈活性,那麼這些並不重要。 (請記住,如果您使用的是大量接口,則vtables的相關位將以L1或L2緩存結束,因此幾乎不會像您擔心的那樣多。)

+0

+1 L1和L2緩存 - 有趣的,相關的和新的 – Elemental 2010-04-26 14:37:41

3

動態分派(即使用虛擬功能)比直接呼叫更昂貴。

但它必須是一個不尋常的計劃,因爲這是性能限制器。更可能限制性能的是磁盤/網絡訪問,更新UI或內存帶寬等。

0

如果您使用接口模式(即C++中的抽象類),那麼是的,虛擬函數調用會有開銷。但是如果你實現了你自己的非抽象類機制來實現同樣的目標,你也會有一個開銷,可能比VF的調用要大。所以實際上,沒有額外的開銷。

0

你可能在談論C++中的虛擬繼承。如果在關鍵代碼路徑中不使用虛擬類,性能損失很小。基本上開銷與額外的函數調用相同。

相關問題