1、類的大小
類的sizeof()大小一般是類中的所有成員的sizeof()大小之和,這個就不用多說。確切的說,用sizeof運算子對乙個型別名操作,得到的是具有該型別實體的大小。注意:類只是乙個型別定義,它本身是沒有大小可言的。
物件大小= vptr(類中定義了多個virtual函式,仍然為占用4個位元組) + 所有非靜態資料成員大小 + aligin位元組大小(依賴於不同的編譯器)。
2、使用sizeof()計算類大小的一些基本原則:
(1)類的大小為類的非靜態成員資料的型別大小之和,也就是說靜態成員資料不作考慮;
(2)類的位元組大小也遵守類似struct位元組對齊的,調整規則;(參考5分鐘搞定記憶體位元組對齊)
(3)成員函式都是不會被計算的;
(4)如果是子類,那麼父類中的成員也會被計算,因為建構函式先初始化父類,所以在計算位元組對齊時,先計算父類的位元組,按父類定義的資料成員的最寬位元組數來為子類進行位元組對齊,類似struct;
(5)虛函式由於要維護虛函式表,所以要佔據乙個指標大小,也就是4位元組。
總結即:乙個類中,虛函式、成員函式(包括靜態與非靜態)和靜態資料成員都不占用類物件的儲存空間。
使用規則如下:
1、資料成員對齊規則:結構(struct)(或聯合(union))的資料成員,第乙個資料成員放在offset為0的地方,以後每個資料成員的對齊按照#pragma pack指定的數值和這個資料成員自身長度中,比較小的那個進行。
2、結構(或聯合)的整體對齊規則:在資料成員完成各自對齊之後,結構(或聯合)本身也要進行對齊,對齊將按照#pragma pack指定的數值和結構(或聯合)最大資料成員長度中,比較小的那個進行。
測試**如下:
#include
using
namespace
std;
//1、空類
class empty_class
;class empty_class1
;//2、虛函式
class virtual_class
;class example1_class
;class example2_class
//普通成員函式,為各例項公有,不歸入sizeof統計
private:
double a;
};class example3_class
//虛函式不記入sizeof統計
virtual
void cc()
private:
int a;
};class example4_class
//< / span> //虛函式記入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()
struct位元組計算
若結構體為空,其大小為1 若不為空,結構體的儲存比較複雜,並不是簡單的位元組相加,比如 struct student 按照我們一般的想法結構體的位元組數sizeof student 1 4 8 13,然而我們在 中驗證後就會發現sizeof student 16 這是為什麼呢?原來是因為記憶體儲存的...
sizeof位元組計算
1 pragma pack 2 2classbu3 ubuf 10void foo 11 typedef char f void 12enum disk 13 bu 求sizeof bu 的值 pragma pack 2 class bu ubuf union的大小取決於它所有的成員中,占用空間最大...
jvm 6 Class位元組碼檔案結構總結
readme 0.1 本文總結於 clas位元組碼檔案,旨在理清 class位元組碼檔案的大體結構 乾貨開始 對上圖的分析 analysis a1 offset 0 a2 offset 0xb0,儲存類索引 父類索引 介面索引 a3 offset 0xb6 查表6 8 儲存字段資訊 a4 offse...