今天閱讀了《深度探索c++物件模型》的c++物件模型的章節1.1~1.5章節的內容。並結合《primer c++第五版》中第六章函式的內容,逐步理解了vtbl和vptr的概念。
vptr(virtual pointer)
每乙個class object中都會包含乙個vptr,用於指向vtbl,儲存在每乙個類物件儲存空間的最前面,vptr是乙個指標。
vtbl(virtua function table)
vtbl是乙個**,裡面儲存指向class中所有virtual 方法的指標,型別為函式指標
虛函式是c++中實現多型的手段,虛函式的宣告只需在宣告時新增virtual關鍵字,而在定義時無需新增。
c++的物件模型的實踐:
使用物件模型描述上面的邏輯:public:
virtual void f()
virtual void g()
virtual void h()
}; int main()
對於(fun)*((int*)*(int*)(&b) + 0)
的拆分理解:
根據c++物件模型的說法,每乙個class所關聯的type_info object也會通過vtbl指出,並且放在第乙個slot,類似於下面的表示:
獲得type_info可以通過下面的方式:
即,認為type_info存放在vptr所指的首位址之前,因此,可以斷定vptr並非指向vtbl的首位址,而是指向第乙個虛函式的位址所在的slot。type_info* typeinfo = (type_info)(((int)(int*)(&b) - 1));
cout << typeinfo->name() << endl;
最後就是關於將子類的物件賦值給父類物件時發生的物件的切片的行為,其中的細節包括賦值過程中對vtbr的操作將有待深究。
c 物件模型
很久之前就想總結一下c 的記憶體使用機制。直到現在剛考完試之制,去實習之前,才有時間完成這事。1.程式使用記憶體區 乙個程式占用的記憶體區一般分為5種 1 全域性 靜態資料區 儲存全域性變數及靜態變數 包括全域性靜態變數和區域性靜態變數 2 常量資料區 儲存程式中的常量字串等。3 區 儲存程式的 4...
C 物件模型
很久之前就想總結一下c 的記憶體使用機制。直到現在剛考完試之制,去實習之前,才有時間完成這事。1.程式使用記憶體區 乙個程式占用的記憶體區一般分為5種 1 全域性 靜態資料區 儲存全域性變數及靜態變數 包括全域性靜態變數和區域性靜態變數 2 常量資料區 儲存程式中的常量字串等。3 區 儲存程式的 4...
C 物件模型
簡單物件模型 乙個c 物件儲存了所有指向成員的指標,而成員本身不儲存在物件中。也就是說不論資料成員還是成員函式,也不論這個是普通成員函式還是虛函式,它們都儲存在物件本身之外,同時物件儲存指向它們的指標。示意圖如右。簡單物件模型對於編譯器來說雖然極盡簡單,但同時付出的代價是空間和執行期的效率.顯而易見...