C 物件模型 2

2021-04-13 23:14:01 字數 1491 閱讀 9231

史列因:我剛看了你寫的「深度探索c++物件模型(1)」,感覺很不錯。不過我有乙個建議:你說「誰知第一章便如此的難以消化,已經反覆讀了3遍,還是有些夾生」是很自然的。第一章是乙個總覽,如果你能全看懂,後面的就沒什麼看的必要了。第一章的內容後面都有詳細介紹,開始只要有個大概印象就可以了。這本書中很多內容都是前後重複的。我建議你先不管看懂看不懂,只管向後看,之後再從頭看幾遍,那樣效果好得多。

我想史列因說的應該是一種非常好的閱讀方式,類似《深度探索c++物件模型》這樣的技術書籍,需要的是理解,和學習英文不同,不能靠死記硬背,如果出現理解不了的情況,那你不妨將書放下,打一盤紅警(俺驕傲的說,我是高手)。或者跳過去也是乙個不錯的方法。好了,我們還是繼續研究c++的物件模型吧。

簡單的物件模型

看書上的例子(注釋是表示solt的索引)

class point

每乙個object是一系列的slots,每乙個slots指向乙個members。

**驅動物件模型

當構造物件時便會有乙個類似指標陣列的東西存放著類資料成員在記憶體中位置的指標,還有指向成員函式的指標。為了對乙個類產生的所有物件實體有乙個標準的表達,所以物件模型採用了**,把所有的資料成員放在資料成員表中,把所有的成員函式的位址放在了成員函式表中,而類物件本身有指向這兩個表的指標。

為了便於理解,雷神來舉個不恰當的例子說明一下,注意是不很恰當的例子 我們把寫字樓看成乙個類,寫字樓中的人看成是類的資料成員,而每乙個租用寫字樓的公司看成類的成員函式。我們來看乙個實體,我們叫它雷神大廈。雷神大廈的物業管理部門需要登記每個出入寫字樓的人,以便發通行證,並且需要登記每個公司的房間號,並製作了乙個牌子在大廳的牆上。實際上這便是類的物件構造過程。你可以通過大廳牆上的公司列表找到任何一家在雷神大廈租房的公司,也可以通過物業提供的花名冊找到任何乙個出入雷神大廈的人。

c++的物件模型

c++物件模型是從簡單物件模型派生得來,並對記憶體空間和訪問時間做了優化。它引入了虛函式表(virtual table)的方案。每個類產生一堆指向虛函式的指標,放在**中。每個類的物件被新增了乙個指標(vptr),指向相關的虛函式表(virtual table)。而這個指標是由每乙個類的constructor、destructor和copy assignment運算子自動完成。

我們還用上面的雷神大廈舉例,物業管理為了提高效率,對長期穩定的公司和人員不再登記,指對不穩定或不能確定的公司進行登記,以便於管理。

再次考驗大家的想象力。

得出結論,c++物件模型和雙**物件模型相比,提高了空間和儲存時間的效率,卻失去了彈性。

試想一下,沒有整個雷神大廈人員和公司的名錄,如果他們發生變化,則需要物業管理部門做很多任務作。重新確定長期穩定的公司和人員是那些。對應應用程式則需要重新編譯。(這次更離譜,但為了保持連貫,大家請進行理解性的思考,不要侷限字面的意思)

這篇筆記是分成多次一點點寫的,甚至每天抽出乙個小時都不能保證(沒辦法最近實在忙),因此可能會有不連貫,如果你讀起來很不爽認為雷神的思維短路了,那屬於正常。不過雷神還是再上傳之前努力的將思路進行了一下整理。希望能把這些支言片語串起來。

C 物件模型之記憶體布局(2)

多重繼承 繼承關係大於2,至少有父類,子類,孫子類三代關係。使用vs2017檢視物件記憶體布局如下 class c size 20 0 base class b 0 base class a 0 4 a1 8 a2 12 b1 16 c1 c vftable c meta 0 0 c a1 1 a ...

C 程式設計2 兼談物件模型

勿在浮沙築高台 正規 大器的程式設計素養,繼續 更多技術 泛型程式設計和物件導向程式設計是兩條不同的技術路線 傳統版本的stl 整個標準庫是泛型程式設計 而非 物件導向 繼承和多型用的不多 1.轉換函式 型別轉換 a b c 說你不用寫返回型別,名稱裡面已經寫了,轉換,不需要引數 const 不應該...

c 物件模型

很久之前就想總結一下c 的記憶體使用機制。直到現在剛考完試之制,去實習之前,才有時間完成這事。1.程式使用記憶體區 乙個程式占用的記憶體區一般分為5種 1 全域性 靜態資料區 儲存全域性變數及靜態變數 包括全域性靜態變數和區域性靜態變數 2 常量資料區 儲存程式中的常量字串等。3 區 儲存程式的 4...