虛表總結

 讓我們對一個帶虛函數的類的內存佈局做一個總結:

    1)虛函數指針存儲在對象內存的最開始4個字節中(這是C++規範決定的)【1】,虛函數指針指向虛表地址。

    2)虛函數表是存儲函數指針的數組,按照虛函數定義的順序存儲了所有虛函數的實際地址。虛函數被調用時,程序通過虛函數指針索引到虛函數表,再通過虛函數表索引到虛函數的實際地址。虛表並不是對象內存的一部分,類的所有對象共有一個虛函數表【2】.

    3)對普通成員函數的調用,編譯時就直接編譯成對函數地址的直接調用。

    4)‘值類型’數據直接存儲在對象的內存中;’引用類型’(對象,堆上分配的數組等)只有指向其實際地址的指針存儲在對象內存中。

 

document註釋

[1]在沒有繼承或者單繼承的情況下,虛函數指針只有一個且始終處於最前端。在多重繼承下,可能有好幾個虛函數指針,主基類的虛函數指針位於最前端。

[2]虛函數表是類關聯信息的一部分。

發佈了18 篇原創文章 · 獲贊 1 · 訪問量 3萬+
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章