物件物件模型:物件在記憶體是如何存放的
存放規則:
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 #includec語言實現多型:using
namespace
std;
class
parent
};class child : public
parent
};struct
test
;int
main()
#include "view codemalloc.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)
#include "view codestdio.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()
型別記憶體模型(物件記憶體模型)
型別的記憶體模型的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是不會占用記憶體空間。這裡的類可以理解為一種特殊資料結構型別。再來談談物件,乙個類例項化後就變成乙個物件...