物件記憶體模型

2022-08-24 16:06:10 字數 3198 閱讀 5030

物件物件模型:物件在記憶體是如何存放的

存放規則:  

1. class記憶體對齊規則和struct相同。

2. class 成員函式和成員變數分開存放,每個物件有獨享的成員變數(堆疊全域性資料),同一類的所有物件共享同一成員函式(**段)。

3. 呼叫成員函式時將物件位址傳遞給成員函式(隱式傳遞),成員函式通過物件位址(this指標)訪問成員變數。 

4. 物件只包含了成員變數,沒有包含成員函式。

#include#include

using

namespace

std;

classa};

classb};

int main(void

)

繼承物件模型:  

1. 子類繼承物件模型時父類成員疊加子類成員得到的。

2. 父類成員函式在**段,子類物件成員函式也在**段  

#include #include 

using

namespace

std;

class

parent

};class child: public

parent

};int

main()

多型的物件模型:

虛函式實現多型的原理:

1. 編譯器為類建立乙個虛函式表。

2. 物件定義乙個指標指向虛函式表。

2. 虛函式表是儲存指向虛函式的指標乙個資料結構。

3. virtual 關鍵字定義的成員 函式會自動放入虛函式表。 

多型呼叫時:p->vir_func();

p --> vptr --> vtable --> 0xff000111

函式呼叫 --> 虛函式表指標 --> 虛函式表中函式指標 --> 虛函式位址

#include #include 

using

namespace

std;

class

parent

};class child : public

parent

};struct

test

;int

main()

c語言實現多型:

#include "

malloc.h

"typedef

void

demo;

typedef

void

derived;

demo* demo_create(int i, int

j);int demo_geti(demo*pthis);

int demo_getj(demo*pthis);

int demo_add(demo* pthis, int

value);

void demo_free(demo*pthis);

derived* derived_create(int i, int j, int

k);int derived_getk(derived*pthis);

int derived_add(derived* pthis, int

value);

static

int demo_virtual_add(demo* pthis, int

value);

static

int derived_virtual_add(demo* pthis, int

value);

struct vtable //

2. 定義虛函式表資料結構

;struct

classdemo

;struct

classderived

;static

struct vtable g_demo_vtbl =;

static

struct vtable g_derived_vtbl =;

demo* demo_create(int i, int

j)

return

ret;

}int demo_geti(demo*pthis)

int demo_getj(demo*pthis)

//6. 定義虛函式表中指標所指向的具體函式

static

int demo_virtual_add(demo* pthis, int

value)

//5. 分析具體的虛函式!!!!

int demo_add(demo* pthis, int

value)

void demo_free(demo*pthis)

derived* derived_create(int i, int j, int

k)

return

ret;

}int derived_getk(derived*pthis)

static

int derived_virtual_add(demo* pthis, int

value)

int derived_add(derived* pthis, int

value)

view code

#include "

stdio.h

"typedef

void

demo;

typedef

void

derived;

demo* demo_create(int i, int

j);int demo_geti(demo*pthis);

int demo_getj(demo*pthis);

int demo_add(demo* pthis, int

value);

void demo_free(demo*pthis);

derived* derived_create(int i, int j, int

k);int derived_getk(derived*pthis);

int derived_add(derived* pthis, int

value);

void run(demo* p, int

v)int

main()

view code

型別記憶體模型(物件記憶體模型)

型別的記憶體模型的3個問題 1 包含什麼 附加資訊 2 怎麼布局 記憶體對齊 3 使用場景 怎麼使用附加資訊 除了包含結構型別的顯式成員變數外,型別記憶體模型需要解決附加資訊的引入問題 1 附加資訊 opaque 有哪些 型別資訊 函式資訊 繼承資訊 記憶體計數等 2 為什麼有附加資訊 1 解決多型...

python物件記憶體模型

首先介紹一下python物件的記憶體模型,如下圖1所示 圖1.pyobject物件記憶體模型 上圖可以看到,乙個pyobject必須包含ob refcnt和ob type 這兩個屬性 ob refcnt是這個物件的引用計數,而ob type則是指向 typeobject結構體的指標,它是python...

C 學習 物件模型之類及物件記憶體模型

使用c 開發一年多,從今天開始系統性的總結下c 一些知識點,畢竟c 語言特性複雜而龐大,很難短時間全部掌握。首先類可以模擬c語言的struct結構體,單純的宣告乙個類a,如果a沒有被例項化,那麼a是不會占用記憶體空間。這裡的類可以理解為一種特殊資料結構型別。再來談談物件,乙個類例項化後就變成乙個物件...