2012-08-14 64 views
6

在C++與-O3編譯,確實不繼承虛擬性有個成本方面:在C++中的運行時繼承成本(沒有虛擬性)?

  • 執行時間
  • 內存

如果答案是肯定的:爲什麼呢?

作爲一個例子:是MyClass1的和MyClass2等效在性能和存儲器方面?

enter image description here

+0

理論上應該沒有性能差異。在實踐中...呃,去測量你的特定場景並找出(我不希望高優化級別有任何不同,但編譯器可能無法內聯基類構造函數調用,或者它可能無法執行EBO,或者......各種各樣的事情都會發生,甚至可能會更快,找出的方法是衡量)。 – 2012-08-14 17:33:08

+0

[繼承的代價是什麼]的可能的重複(http://stackoverflow.com/questions/7210412/what-is-the-cost-of-inheritance) – 2012-08-14 17:38:32

+0

+1:好的圖片。 – 2012-08-14 17:46:51

回答

8

執行時間

怎麼樣?函數是靜態解析的,所以函數調用是相同的。 MyClass1的構造函數將調用基類的構造函數,其析構函數將調用基類的析構函數,因此對於構造&的銷燬可能會有一些開銷。 也許。有些編譯器可能會優化掉電話。

存儲器

這將是相同的,二者只有一個構件double。理論上。我認爲這取決於實施,因爲它沒有被標準強制執行,但最常見的是沒有內存開銷。

注意通過指針Derived結果不確定的行爲刪除對象MyClass1,因爲沒有virtual析構函數。

注2沒有繼承多態性是一個代碼味道。不要說這是錯誤的,但在大多數情況下,組合更好。

+0

由於構造函數和析構函數非常簡單,它們應該是內聯的,並且編譯器將爲這兩個版本生成相同的代碼。 – 2012-08-14 17:35:33

+0

關於構建和破壞:編譯器是否會爲Base中定義的重載運算符優化臨時構造/銷燬? – Vincent 2012-08-14 18:19:50

+0

@Vincent - 我不明白這個問題。超載的操作員和臨時人員之間沒有固有的聯繫。 – 2012-08-14 18:29:30

-3

在存儲空間方面,我猜是因爲它需要跟蹤的所有類結構和關係,你MyClass1的消耗更多。對於性能我沒有看到任何顯着的差異。

+3

我懷疑這是真的。 – 2012-08-14 17:43:01

+0

借調。小心給出一個引文,或者至少推理? – delnan 2012-08-14 17:44:28

+0

類結構和關係由編譯器處理。沒有虛擬化,這些都沒有運行時間的損失。 – 2012-08-14 17:45:28