虛擬繼承內存佈局圖示

虛繼承內存佈局

 

   在同時使用了虛函數的時候,虛基類表可以合併到虛表(virtual table)中,每對象的虛基類表指針(vbptr)也可以省略(只需vptr即可)。

  虛函數是C++衆多運行時多態特性中開銷最小,也最常用的機制。虛函數的好處和作用這裏不再多說,應當注意在對性能有苛刻要求的場合,或者需要頻繁調用,對性能影響較大的地方(比如每秒鐘要調用成千上萬次,而自身內容又很簡單的事件處理函數)要慎用虛函數。

  需要特別說明的一點是:虛函數的調用開銷與通過函數指針的間接函數調用(例如:經典C程序中常見的,通過指向結構中的一個函數指針成員調用;以及調用 DLL/SO中的函數等常見情況)是相當的。比起函數調用本身的開銷(保存現場->傳遞參數->傳遞返回值->恢復現場)來說,一次指針間接引用是微不足道的。這就使得在絕大部分可以使用函數的場合中都能夠負擔得起虛方法的些微額外開銷。

  作爲一種支持多繼承的面嚮對象語言,虛基類有時是保證類層次結構正確一致的一種必不可少的手段。但在需要頻繁使用基類提供的服務,又對性能要求較高的場合,應該儘量避免使用它。在基類中沒有數據成員的場合,也可以解除使用虛基類。例如,在上圖中,如果類 "BB" 中不存在數據成員,那麼 "BB" 就可以作爲一個普通基類分別被 "B1" 和 "B2" 繼承。這樣的優化在達到相同效果的前提下,解除了虛基類引起的開銷。不過這種優化也會帶來一些問題:從 "DD" 向上強制到 "BB" 時會引起歧義,破壞了類層次結構的邏輯關係。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章