有了關於繼承、虛繼承等相關知識的了解。現在我們主要針對類的大小問題來做乙個具體的**吧。
1、真空類
class
cnull
;
大小就是1
主要是因為空類還是要被例項化的,為了保證每個例項在記憶體中都有獨一無二的位址。編譯器就給空類隱含的增加了乙個位元組。
2、空類
class
cnull2
~cnull2()
void
foo()}
;
大小是1
這種情況和空類是差不多的,內部成員函式並不會影響類的大小
1、簡單類
class
conemember
;private
:int m_ione;
};
大小是4
因為有int型成員變數
2、簡單繼承
class
ctwomember
:public conemember
;
大小是8
子類成員接在父類成員之後的。就相當於有兩個int型的整形變數。
3、再繼承
class
cthreemember
:public ctwomember
;private
:int m_ithree;
};
大小是12
孫類成員接在子類之後,再再繼承就依次類推
4、多重繼承
class
classa
;private
:int m_ia;};
class
classb
;private
:int m_ib;};
class
classc
;private
:int m_ic;};
class
ccomplex
:public classa,
public classb,
public classc
;private
:int m_icomplex;
};
大小是16
總結
1、虛繼承
class
ctwomember
:virtual
public conemember
;
大小是12
記憶體結構:
e8 2f 42 00 //指標,指向乙個關於偏移量的陣列,且稱之虛基類偏移量表指標主要的就是因為存在虛函式指標,其指向了乙個虛函式表存放了三部分的資訊,包括了rtti執行時型別資訊、虛函式指標相對於整體作用域的偏移還有虛函式的入口位址。cc cc cc cc // m_itwo
00 00 00 00 // m_ione(虛基類資料成員)
2、帶虛函式的空類
class
cvirtualnull
~cvirtualnull()
virtual
void
foo()}
;
大小是4
因為虛函式裡面會存在乙個虛函式指標指向乙個虛函式表。但是請記住,虛函式表只有一張,當子類中又存在乙個虛函式的時候,不會因為增加了新的虛函式而多出來一張表,新的虛函式的指標將新增在複製了的虛表後面。
c 類的大小
初學者在學習物件導向的程式語言時,或多或少的都些疑問,我們寫的 與最終生編譯成的 卻 大相徑庭,我們並不知道編譯器在後台做了什麼工作 這些都是由於我們僅停留在語言層的原因,所謂語言層就是教會我們一些基本的語法法則,但不會告訴我們為什麼這麼做?今天和大家談的一點感悟就是我在學習程式設計過程中的一點經驗...
C 類的大小
乙個空類class a 的大小為什麼是1,因為如果不是1,當定義這個類的物件陣列時候a objects 5 objects 0 和objects 1 就在同乙個位址處,就無法區分。單繼承 includeusing namespace std class aprivate char k 3 class...
C 類的大小
前言 c 類所占用的記憶體空間實際上是指類的例項所占用的記憶體空間。其大小是由類中的成員變數決定的 靜態成員變數除外 由於成員函式放到 區由類的各個例項共享,故成員函式對類占用記憶體大小沒有影響。具體地說,類占用記憶體大小由以下三個方面決定 1.非靜態成員變數的記憶體占用之和 2.考慮記憶體對其的問...