使用sizeof 計算類的大小

2021-07-11 21:37:42 字數 2369 閱讀 5724

《劍指offer》這本書裡第22頁有講到sizeof()計算類大小的問題,在網上查閱了一些資料,進行了一些總結。歡迎補充指正!

1、類的大小

類的sizeof()大小一般是類中的所有成員的sizeof()大小之和,這個就不用多說。

確切的說,用sizeof運算子對乙個型別名操作,得到的是具有該型別實體的大小。注意:類只是乙個型別定義,它本身是沒有大小可言的。

物件大小=   vptr(可能不止乙個,這個很難確定,類中定義了乙個virtual函式,仍然為占用4個位元組)   +   所有非靜態資料成員大小   +   aligin位元組大小(依賴於不同的編譯器)。

2、使用sizeof()計算類大小的一些基本原則

(1)類的大小為類的

非靜態成員資料

的型別大小之和,也就是說

靜態成員資料

不作考慮;

(2)類的總大小也遵守類似class位元組對齊的,調整規則;(參考5分鐘搞定記憶體位元組對齊)

(3)成員函式都是不會被計算的;

(4)如果是子類,那麼父類中的成員也會被計算;

(5)虛函式由於要維護虛函式表,所以要佔據乙個指標大小,也就是4位元組。

總結即:乙個類中,虛函式、成員函式(包括靜態與非靜態)和靜態資料成員都不占用類物件的儲存空間。

3、空類的大小

《劍指offer》裡的分析:空型別的例項中不包含任何資訊,本來求sizeof的結果應該是0,但是當我們宣告該型別的例項時,必須在記憶體中占有一定得空間,否則無法使用這些例項。至於佔多少記憶體,由編譯器決定。在visual studio中,每個空型別的例項占用1位元組的空間。

因為乙個空類也要例項化,所謂類的例項化就是在記憶體中分配一塊位址,每個例項在記憶體中都有獨一無二的位址。同樣空類也會被例項化,所以編譯器會給空類隱含的新增乙個位元組,這樣空類例項化之後就有了獨一無二的位址了。所以空類的sizeof()為1。

4、程式設計舉例

#includeusing namespace std;

//1、空類

class empty_class

;class empty_class1

;//2、虛函式

class virtual_class

;class example1_class

;class example2_class

//普通成員函式,為各例項公有,不歸入sizeof統計

private:

int a;

};class example3_class

//虛函式不記入sizeof統計

private:

int a;

};class example4_class

//虛函式記入sizeof統計

private:

int a;

};class example5_class

;class example6_class //該類裡面包含乙個函式和乙個虛函式,取最大的占用4個位元組

void func_2() {}

virtual void func_3() {}

virtual void func_4() {}

};//3、繼承

class inherit_class:public example2_class

;int main()

ubuf;

void foo(){}

typedef char*(*f)(void*);

enumdisk;

}bu;

那麼sizeof(bu)的值是多少?

分析:乙個class物件占用記憶體空間為非靜態成員變數總和+ 資料對齊處理+虛函式。

int=4

,union=13+1=14

,enum=4(記憶體中當成int來儲存)

,4+14+4=22,

f只是乙個定義,不是實際上的指標,沒有佔位元組。另外

union的大小取決於它所有的成員中,占用空間最大的乙個成員的大小,並且需要記憶體對齊,這裡因為#pragma pack(2),所以union的大小為14,如果不寫#pragma pack(2),那麼union大小為16【因為與sizeof(int)=4對齊】。

但是如果我加入乙個int*。即:

class bu

ubuf;

void foo(){}

typedef char*(*f)(void*);

enumdisk;

int *a;

}bu;

那麼得到sizoef(bu)=30,int型指標佔8個位元組。

sizeof中對於類大小的計算

空類 1 沒有虛函式 sizeof 資料成員 的和 有虛函式 sizeof 資料成員 的和 sizeof v表指標 類的大小不包含靜態資料成員大小,靜態資料存放 在靜態儲存區。一 簡單物件 include class a int a c 123 int main int a c 123 class ...

sizeof 類 的大小

什麼是類的例項化,所謂類的例項化就是在記憶體中分配一塊位址 那我們先看看乙個例子 include class a class b class c public a class d public b,public c int main 程式執行的輸出結果為 sizeof a 1 sizeof b 1 ...

sizeof 類的大小

首先,類的大小是什麼?確切的說,類只是乙個型別定義,它是沒有大小可言的。用sizeof運算子對乙個型別名操作,得到的是具有該型別實體的大小。如果 class a a obj 那麼sizeof a sizeof obj 那麼sizeof a 的大小和成員的大小總和是什麼關係呢,很簡單,乙個物件的大小大...