在C++與-O3編譯,確實不繼承虛擬性有個成本方面:在C++中的運行時繼承成本(沒有虛擬性)?
- 執行時間
- 內存
如果答案是肯定的:爲什麼呢?
作爲一個例子:是MyClass1的和MyClass2等效在性能和存儲器方面?
在C++與-O3編譯,確實不繼承虛擬性有個成本方面:在C++中的運行時繼承成本(沒有虛擬性)?
如果答案是肯定的:爲什麼呢?
作爲一個例子:是MyClass1的和MyClass2等效在性能和存儲器方面?
執行時間
怎麼樣?函數是靜態解析的,所以函數調用是相同的。 MyClass1
的構造函數將調用基類的構造函數,其析構函數將調用基類的析構函數,因此對於構造&的銷燬可能會有一些開銷。 也許。有些編譯器可能會優化掉電話。
存儲器
這將是相同的,二者只有一個構件double
。理論上。我認爲這取決於實施,因爲它沒有被標準強制執行,但最常見的是沒有內存開銷。
注意通過指針Derived
結果不確定的行爲刪除對象MyClass1
,因爲沒有virtual
析構函數。
注2沒有繼承多態性是一個代碼味道。不要說這是錯誤的,但在大多數情況下,組合更好。
由於構造函數和析構函數非常簡單,它們應該是內聯的,並且編譯器將爲這兩個版本生成相同的代碼。 – 2012-08-14 17:35:33
關於構建和破壞:編譯器是否會爲Base中定義的重載運算符優化臨時構造/銷燬? – Vincent 2012-08-14 18:19:50
@Vincent - 我不明白這個問題。超載的操作員和臨時人員之間沒有固有的聯繫。 – 2012-08-14 18:29:30
在存儲空間方面,我猜是因爲它需要跟蹤的所有類結構和關係,你MyClass1的消耗更多。對於性能我沒有看到任何顯着的差異。
我懷疑這是真的。 – 2012-08-14 17:43:01
借調。小心給出一個引文,或者至少推理? – delnan 2012-08-14 17:44:28
類結構和關係由編譯器處理。沒有虛擬化,這些都沒有運行時間的損失。 – 2012-08-14 17:45:28
理論上應該沒有性能差異。在實踐中...呃,去測量你的特定場景並找出(我不希望高優化級別有任何不同,但編譯器可能無法內聯基類構造函數調用,或者它可能無法執行EBO,或者......各種各樣的事情都會發生,甚至可能會更快,找出的方法是衡量)。 – 2012-08-14 17:33:08
[繼承的代價是什麼]的可能的重複(http://stackoverflow.com/questions/7210412/what-is-the-cost-of-inheritance) – 2012-08-14 17:38:32
+1:好的圖片。 – 2012-08-14 17:46:51