class位元組計算

2021-07-22 04:26:10 字數 1724 閱讀 5347

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...