c 物件模型通俗理解

2021-09-11 18:13:22 字數 1657 閱讀 6162

類例項化後該類物件成員記憶體分布情況。

有虛函式的類,都會給該類分配乙個虛函式表。

在類物件記憶體內:虛函式指標、根據宣告順序的非靜態資料成員

在類物件記憶體外:type_info(rtti(執行時型別識別) 通過rtti,能夠通過基類的指標或引用來檢索其所指物件的實際型別),虛函式表,靜態資料成員,靜態函式,非靜態函式。其中在**區:非靜態函式;全域性/靜態儲存區:虛函式表(所有類共用乙份猜出在全域性區),靜態資料成員,靜態函式;

單繼承: 子類物件記憶體內分布依次:虛函式指標,父類非靜態資料成員,子類非靜態資料成員。類物件的虛函式表成員有父類虛函式、子類虛函式。如果子類重寫父類虛函式,那就替換了改父類函式。

普通多繼承

多重繼承(多個父類)。有多個有虛函式父類,子類記憶體相應多個虛函式指標分別指向多個虛表,每個虛函式表有有父類虛函式、子類虛函式。

類的繼承關係如下:class derived : public base1, public base2

derived類的物件的記憶體布局為:基類base1子物件和基類base2子物件及derived類的非static成員變數組成。基類子物件包括其虛函式表指標和其非static的成員變數。有多個有虛函式父類,子類記憶體相應多個虛函式指標指向虛表,每個虛函式表有有父類虛函式、子類虛函式。

重複繼承

重複繼承(繼承的多個父類中其父類有相同的超類),有多個有虛函式父類,子類記憶體相應多個虛函式指標分別指向多個虛表,每個虛函式表有有父類虛函式、子類虛函式。

類的繼承關係如下:

derived類的物件的記憶體布局與多繼承相似,但是可以看到基類base的子物件在derived類的物件的記憶體中存在乙份拷貝base。這樣直接使用derived中基類base的相關成員時,就會引發歧義,可使用多重虛擬繼承消除之

多重虛擬繼承(使用virtual方式繼承,為了保證繼承後父類的記憶體布局只會存在乙份)

類的繼承關係如下:

derived類的物件的記憶體布局與重複繼承的類的物件的記憶體分布類似,但是基類base的子物件沒有拷貝乙份在物件的記憶體中僅存在在乙個base類的子物件。但是它的非static成員變數放置在物件的末尾處

C 物件記憶體模型延伸理解

在程式設計時,時常會說我們是面向過程程式設計,還是物件導向程式設計。其它這是把底層記憶體處理過程,通過編譯器來抽象實現。不管是面向什麼程式設計,其它底下都是面向記憶體程式設計。在程式設計過程中,如c 等高階語言都是物件導向程式設計的方式實現。都要涉及到物件的記憶體模型問題。如果我例項化乙個物件,那這...

oc物件模型理解

首先,oc是一門程式語言,foundation是乙個為oc而生的為了方便程式設計師使用的程式設計框架。這裡可以用各司其職來形容它們 作為一門物件導向程式設計語言,oc本身只需要關注自己的物件模型的管理,也就是它只需要管理好oc物件,類,這些東西的組織和聯絡。而作為乙個基於oc的框架,foundati...

深入理解C 物件模型1 關於物件

c 物件模型可以從兩個層面來解釋 本文主要從第二個方面來進行剖析。注 c 物件模型的底層實現機制並未標準化,不同的編譯器對物件模型的底層實現機制可能有所差異,但其目標都是優化物件空間和時間的訪問效率,並支援c 語言說規定的虛函式,虛基類等機制。相比於c,c 在記憶體布局以及訪問時間 效率 上的主要的...