簡單物件模型:乙個c++物件儲存了所有指向成員的指標,而成員本身不儲存在物件中。也就是說不論資料成員還是成員函式,也不論這個是普通成員函式還是虛函式,它們都儲存在物件本身之外,同時物件儲存指向它們的指標。示意圖如右。
簡單物件模型對於編譯器來說雖然極盡簡單,但同時付出的代價是空間和執行期的效率.顯而易見的是對於每乙個成員都要額外搭上乙個指標大小的空間以及對於每成員的操作都增加了乙個間接層.因此c++並沒有採用這樣一種物件模型,但是被用到了c++中「指向成員的指標」的概念當中。
**驅動模型則更絕,它將物件中所有的成員都抽離出來在外建表,而物件本身只儲存指向這個表的指標。右圖可以看到,它將所有的資料成員抽離出來建成資料成員表,將所有的函式抽取出來建成一張函式成員表,而物件本身只保持乙個指向資料成員表的指標。
侯大大認為,在物件與成員函式表中間應當加乙個虛箭頭,他認為這是lippman的疏漏之處,應當在物件中儲存指向函式成員表的指標。
然而我在這兒還是保留原書(而非譯本)的截圖,因為以我之拙見,不儲存指向成員函式表的指標也沒有妨礙。因為形如float point::x() 的成員函式實際上相當於float x(point* )型別的普通函式,因此儲存指向成員函式表的指標當屬多此一舉。
當然c++也沒有採用這一種物件模型,但c++卻以此模型作為支援虛函式的方案。
所有的非靜態資料成員儲存在物件本身中。所有的靜態資料成員、成員函式(包括靜態與非靜態)都置於物件之外。另外,用一張虛函式表(virtual table)儲存所有指向虛函式的指標,並在表頭附加上乙個該類的type_info 物件,在物件中則儲存乙個指向虛函式表的指標。如下圖:
c 物件模型
很久之前就想總結一下c 的記憶體使用機制。直到現在剛考完試之制,去實習之前,才有時間完成這事。1.程式使用記憶體區 乙個程式占用的記憶體區一般分為5種 1 全域性 靜態資料區 儲存全域性變數及靜態變數 包括全域性靜態變數和區域性靜態變數 2 常量資料區 儲存程式中的常量字串等。3 區 儲存程式的 4...
C 物件模型
很久之前就想總結一下c 的記憶體使用機制。直到現在剛考完試之制,去實習之前,才有時間完成這事。1.程式使用記憶體區 乙個程式占用的記憶體區一般分為5種 1 全域性 靜態資料區 儲存全域性變數及靜態變數 包括全域性靜態變數和區域性靜態變數 2 常量資料區 儲存程式中的常量字串等。3 區 儲存程式的 4...
C 物件模型
一 c 簡單物件模型 乙個ojbect是一系列的slots,每個slots指向乙個members data member or function member members都不放在objects之中,objects中有的只是一系列member的指標而已 簡單物件模型中的索引思想引申出兩指向成員的指...