第一:空類的大小
class cbase
;
執行cout<<"sizeof(cbase)="《輸出
sizeof(cbase)=1;
為什麼空的什麼都沒有是1呢?
先了解乙個概念:類的例項化,所謂類的例項化就是在記憶體中分配一塊位址,每個例項在記憶體中都有獨一無二的位址。同樣空類也會被例項化,所以編譯器會給空類隱含的新增乙個位元組,這樣空類例項化之後就有了獨一無二的位址了。所以空類的sizeof為1。
第二:一般非空類大小
class cbase
;
執行結果:
sizeof(cbase)=8
第三:有虛函式類class cbase
;
執行結果:
sizeof(cbase)=12
「c++ 類中有虛函式的時候有乙個指向虛函式的指標(vptr),在32位系統分配指標大小為4位元組」。
第四:有虛函式類的繼承
基類就是上面的了不寫了
class cchild :
public cbase
;
執行結果:
sizeof(cchild)=16;
可見子類的大小是本身成員變數的大小加上父類的大小。
另外:1. 空類
class a;
void main()
2.虛函式class a
;
得到結果:4
當c++ 類中有虛函式的時候,會有乙個指向虛函式表的指標(vptr),在32位系統分配指標大小為4位元組。所以size為4.
3.靜態資料成員
class a
;
得到結果:8
靜態資料成員被編譯器放在程式的乙個global data members中,它是類的乙個資料成員.但是它不影響類的大小,不管這個類實際產生了多少例項,還是派生了多少新的類,靜態成員資料在類中永遠只有乙個實體存在。
而類的非靜態資料成員只有被例項化的時候,他們才存在.但是類的靜態資料成員一旦被宣告,無論類是否被例項化,它都已存在.可以這麼說,類的靜態資料成員是一種特殊的全域性變數.
所以該類的size為:int a型4位元組加上虛函式表指標4位元組,等於8位元組。
4.普通成員函式
class a
結果:1
類的大小與它的建構函式、析構函式和其他成員函式無關,只已它的資料成員有關。
5.普通繼承
class a
;class b
;class c : public a, public b
;
結果為:sizeof(c) =12.
可見普通的繼承,就是基類的大小,加上派生類自身成員的大小。
6.虛擬繼承
class c : virtual public a, virtual public b
;
結果:16.
當存在虛擬繼承時,派生類中會有乙個指向虛基類表的指標。所以其大小應為普通繼承的大小(12位元組),再加上虛基類表的指標大小(4個位元組),共16位元組。
類的大小問題實驗剖析:
1、空類:
c++編譯器強制給這種類插入乙個預設成員,長度為1。如果有自定義的變數,變數將取代這個預設成員。
class a
{};cout<2、只有乙個char型class a
;cout<3、有5個char型class a
;cout<4、乙個char型 + 乙個int型:位元組對齊class a
;cout<5、2個char型 + 乙個int型class a
;cout<6、5個char型 + 乙個int型class a
;cout<7、1個char型 + 1個int型 + 2個char型class a
;cout<8、普通函式不佔空間class a
//0byte
int c(){};
};cout<9、虛函式 佔4個位元組:指向虛函式表的指標class a
};cout<10、多個虛函式等同於1個虛函式class a
virtual void d(){}
};cout<11、多繼承問題中sizeofclass b{};
class c :public b
;class d :public b ,public c{};
cout<12、單繼承問題中sizeofclass b{};
class c :public b
;class d :public c{};
cout<13、靜態資料成員 和 成員函式 不佔空間class a;};
cout<14、const資料變數佔空間 和 const成員函式不佔空間class a
int d() const{}
int e() const{}
virtual void g(){}
a() :b(2), c(3)
};cout《空類的大小class base
;
接著看下面一段**class base
private:
int a; //佔4位元組
char *p; //4位元組指標
};class derive:public base
;
~derive(){};
private:
static int st; //非例項獨佔
int d; //佔4位元組
char *p; //4位元組指標
};int main()
; ~derive(){};
private:
static int st;
int d;
char *p;
char c;
};
這個時候,結果就變成了
12
24
乙個char c;增加了4位元組,說明類的大小也遵守類似class位元組對齊,的補齊規則。
至此,我們可以歸納以下幾個原則:
1.類的大小為類的非靜態成員資料的型別大小之和,也就是說靜態成員資料不作考慮。
2.普通成員函式與sizeof無關。
3.虛函式由於要維護在虛函式表,所以要佔據乙個指標大小,也就是4位元組。
4.類的總大小也遵守類似class位元組對齊的,調整規則。
5、不佔空間的有:普通函式,靜態資料成員,靜態成員函式。
6、無論多少個,只相當於乙個所佔的空間:虛函式。
7、空類佔1個位元組。
8、既有字元型又有整型,要考慮位元組對齊。
9、普通資料成員、const資料成員佔空間;靜態成員不佔空間。
參考:
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.考慮記憶體對其的問...