c 的物件模型探測(一)

2021-08-21 01:43:21 字數 1821 閱讀 9103

物件導向程式設計的時候總會好奇,成員變數存放在**,成員函式存放在記憶體的**,static變數又存放在**?都是在宣告的object裡嗎?通過閱讀《深度探索c++物件模型》,該類的問題都能找到答案。

c++的設計者從簡至繁是提出過幾個物件模型,我在此一一介紹:

簡單物件模型

第乙個模型十分簡單,它最大地減低了c++編譯器的設計複雜度,但犧牲了空間和執行期的效率。在這個簡單模型中,乙個object是一系列的slots,每乙個slot指向乙個members。members按其宣告順序,各被指定乙個slot。每乙個data member都有自己的乙個slot。下圖可說明此模型:

在這個簡單模型下,members本身並不放在object之中。只有」指向member的指標」才放在object內。這麼做可以避免」members有不同的型別,因而需要不同的儲存空間」所招致的問題。object中的members是以slot的索引值來定址的,本例之中_x的索引是6,_point_count的索引是7。乙個class object的大小很容易計算出來:」指標大小,乘以class中所宣告的members個數」便是。

雖然這個模型並沒有被應用於實際產品上,不過關於索引或slot個數的觀念,倒是被應用到c++的」指向成員的指標」(pointer-to-member)觀念之中。

**驅動物件模型

為了對所有classes的所有objects都有一致的表達方式,另一種物件模型是把所有與members相關的資訊抽出來,放在乙個data member table和乙個member function table之中,class object本身則內含指向這兩個**的指標。member function table是一系列的slots,每乙個slot指出乙個member function;data member table則直接持有data本身,如下圖:

雖然這個模型也沒有實際應用於真正的c++編譯器身上,但member function table 這個觀念卻成為支援virtual functions的乙個有效方案 。

c++ 物件模型

c++著名程式設計師stroustrup當初設計(目前仍占有優勢)c++物件模型是從簡單物件模型派生而來的,並對記憶體空間和訪問時間做了優化。在此模型中,nonstatic data members 被配置於每乙個class object之內,static data members則被存放在個別的class object之外。static和nonstatic function members也被放在個別的class object之外。virtual functions則以兩個步驟支援之:

1.每乙個class產生出一堆指向virtual functions的指標,放在**之中。這個**被稱為virtual table(vtbl)。

2.每乙個class object被安插乙個指標,指向相關的virtual table。通常這個指標被稱為vptr。vptr的設定(setting)和重置(resetting)都由每乙個class的constructor、destructor和copy assignment運算子自動完成(我將在第5章討論這個問題)。每乙個class所關聯的type_info object(用以支援runtime type identification,rtti)也經由virtual table被指出來,通常放在**的第乙個slot。

最後這個模型不正是我們現在大多數書籍上都提到的模型嗎?

C 物件模型(一)

在c 中,有兩種類成員變數 static 和 nonstatic 三種類成員函式 static nonstatic 和 virtual 如 class point 簡單物件模型 圖1 簡單物件模型 在這個模型中,乙個object是一些列的slots,每乙個slot指向乙個成員,成員按其宣告次序,各被...

C 物件模型(一)

我們先定義乙個基類。class base virtual base void no static member function static void static member function virtual void virtual member function private int n...

C 物件模型筆記 一 C 物件

c 支援了資料和方法的聯絡。對 c 來說,他的布局成本就是 1.none static data member 2.a pointer to virtue table 3.the pointer to virtue class 而成員函式,並不包括在 c 物件裡。還而言之,每乙個非 inline 成...