類中的元素:類成員變數、類成員函式、靜態成員變數、靜態成員函式、虛函式、純虛函式 。
影響物件大小的元素:類成員變數、虛函式表指標、虛基類指標、記憶體對齊。
注:所有的靜態成員變數、靜態成員函式、類成員函式都不會影響物件的大小,純虛函式與虛函式一樣都由虛函式表指標來管理。
_vftptr、_vbtptr的初始化由物件的建構函式, 賦值運算子自動完成;物件生命週期結束後,由物件的析構函式來銷毀。
物件所關聯的型別(type_info),通常放在virtual table的第乙個slot中。_vftptr、_vbtptr的初始化由物件的建構函式, 賦值運算子自動完成;物件生命週期結束後,由物件的析構函式來銷毀。
本測試使用的工具:
注:下述類中的成員變數均為int型別,由於類中的非虛成員函式都不影響物件的大小,因此類中涉及的成員函式均為虛函式。
記憶體布局:
記憶體布局:
注:在單一繼承中,子類中不含有虛函式表指標,它共享其基類的虛函式表指標。
記憶體布局:
注:跟單一繼承一樣,子類中並不含有虛函式表指標(vfptr),它共享其繼承的第乙個基類的虛函式表指標。它繼承的每個基類中都各自含有自己的虛函式表指標。
記憶體布局:
注:如果子類中的虛函式與基類中的虛函式完全相同,則子類中不再會存在vfptr指標。此類情況會影響子類物件的大小。
如果子類中的虛函式與基類中的虛函式不相同,則子類中也會存在vfptr指標,這是
虛繼承與非虛繼承的區別,還有一點區別就是在虛繼承中會存在vbptr指標。
虛表中第乙個條目存放的是虛基類表指標到該類記憶體首位址的偏移量,第
二、第三...個條目是該類的最左虛繼承基類、次左虛繼承基類...的記憶體位址相對於該類記憶體首位址的偏移量。
下面例子解釋基類與子類虛函式相同時的情形:
記憶體布局:
C 物件記憶體布局
好文要記下來 上 下 玄機逸士系列 補充一點,兩個博文裡面都沒有給出虛基類表中的第一項的解釋,其實第一項就是vbptr到自己類物件位址的偏移量。若沒有虛函式,也就是沒有vfptr,偏移量為0,若有,就為 4 vfptr 在 vbptr之前,所以是 4 玄機逸士的結論 vc 6 其一,只要涉及到虛基類...
C 物件記憶體布局
單一的一般繼承 可見以下幾個方面 1.虛函式表在最前面的位置 2.成員變數根據其繼承和宣告的順序一次放在後面 3.在單一繼承中,被 overwrite 的虛函式在虛函式表中得到更新 多重繼承 我們可以看到 1.每個父類都有自己的虛函式表 2.子類的成員函式被放在第乙個父類的表中 3.記憶體布局中,父...
C 記憶體物件布局
本章主要介紹了c 類中成員變數 函式物件的在記憶體中布局.當c 類中不包含virtual機制類的函式時,內部nostatic member被包含在每乙個class object之中,就想c struct一樣,而member function雖然含在class宣告之內,卻不出現在object之中,每乙...