C++對象模型學習筆記(一)

    最近再學習一本書,書名爲《深度探索c++對象模型》,之後會將本書的學習筆記寫在這裏。c++

chapter 1  關於對象ide

    首先介紹一下幾種對象模型,也就是對象再內存中的存在形式。函數

     一、簡單對象模型(A Simple Object Model)佈局

          對於簡單對象模型,以下圖所示:學習

 

簡單對象模型

       在Object中不存儲任何直接的data member 或 function member, object中存儲的都是指針,這個指針指向members。 這就是簡單對象模型,對於此模型,能夠避免諸如「不一樣的數據類型,須要不一樣的的存儲空間」這一類的問題。優化

二、 表格驅動對象模型(A Table-driven Object Model)this

    表格驅動對象模型以下圖:spa

 

表格驅動對象模型

  在object中,只存在兩個指針,一個指向member data table, 另外一個指向member Function table. 在member data talbe中存在着實際的數據,在member function talbe中存在的只是成員函數的指針。指針

三、C++ 對象模型對象

    C++對象模型,是從簡單對象模型派生而來,又作了不少的優化。 全部的非靜態數據都存在與object中,而全部的靜態數據,都存在於object以外,全部的成員函數(不管靜態與非靜態)也都存在與object以外。而對於虛函數,則已如下兩個步驟支持之:

    (1) 每個class產生出一堆指向virtual function的指針,存於一張表中,而一般這張表成爲virtual table(vtbl).

    (2)每個object中都會存有一個指針,指向(1)中的表,一般這個指針成爲vtpr。vtpr的設定、重置等操做都是由class的構造函數,析構函數或複製拷貝函數自動完成。

以上就是幾種對象模型。

下面再摘抄幾句話。

  一、 C++中凡是處於一個access section中的數據,在內存中一定保證按照聲明順序在內存中進行佈局。而對於多個access section中的各筆數據,內存佈局則不敢保證。也就說即便你把protect放在前面,而把public放在後面,也不敢保證protect的數據在內存中排列在public前面

  二、 一個指針,無論它指向哪種數據類型,它自己的大小時固定的。不一樣類型的指針之間的差別,不在於指針表示法不一樣,也不在其內容不一樣,而在於它所指向的object的類型不一樣。也就是說,不一樣類型的指針會告訴編譯器對它所指向的地址及內容的不一樣的解釋方式。類型不一樣,則對地址和內容的解釋方式不一樣。

相關文章
相關標籤/搜索