C 類的大小 sizeof class

2022-07-01 12:27:10 字數 3567 閱讀 7883

第一:空類的大小

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.考慮記憶體對其的問...