2009-04-15 79 views
6

據我瞭解,所有成員函數都是在d虛擬的,但是編譯器是免費的,使功能非虛,如果它認爲它們永遠不會覆蓋。有沒有一種方法,以確保成員函數在d虛擬?

什麼我不是清楚的是,當你編譯在成員函數沒有被重載一個模塊,然後導入模塊的其他地方,你重寫一個成員函數會發生什麼。我不認爲它重新編譯原始模塊。它是否簡單地假設任何具有外部鏈接的成員函數都是虛擬的?

回答

5

所有d成員函數是通過默認虛擬。我不認爲有任何編譯器實際上使得函數非虛擬化成爲優化。儘管可以通過將類或函數標記爲「final」來手動完成。

1

我相信FeepingCreature是正確的,但另外我認爲你可以假設這樣的優化只會被編譯器考慮,如果它直接從源創建一個可執行文件。

2

FeepingCreature是除了不能進行虛擬模板函數大多正確。

2

這是如何實現的編譯器和鏈接器特定的。但是虛擬函數調用可以被優化的一種常見情況是當你在本地實例化一個類時。然後函數調用可以直接此範圍內進行,這是因爲類的類型是在編譯時完全清楚。這可以在編譯器級別完成。除此之外,如果鏈接器實現函數實現不會被覆蓋,那麼鏈接器可能會進行優化,並用該類上的直接函數調用替換虛函數調用。特別是,如果一個類永遠不會派生出來,那麼所有對成員函數的調用都可以直接執行。就好像鏈接器會盡可能插入'final'關鍵字。 (鏈接器可能不會將此優化應用於導出的類和函數,因爲鏈接器不知道函數是否在其他庫或可執行文件中被覆蓋。)

相關問題