C 中類的大小計算方法總結

2021-07-27 06:31:41 字數 1281 閱讀 4990

c++中類的成員函式,靜態成員是不佔類的大小的。類的大小等於基類的大小+子類個non-static成員變數的大小再+非虛基類大小,如果有多型性還要考慮vptr(可能不止乙個)大小,這裡成員變數是會被位元組對齊的。

1、空類的大小為1位元組

2、位元組對齊的問題 

成員變數需要整齊的儲存,所以若是有不同型別的變數(本身占用位元組數不同),則所有變數的大小會按照最大的的大小進行補齊,比如說,若是乙個類中有個bool型和int型,則bool型也會占用4個位元組。若最大的為short,則bool型或者char型會補齊成為2個位元組,最大的為double,則都補齊成為8位元組。

並且即使成員完全相同但排列不同計算出的類的大小也可能完全不同。

如下例:

乙個類的大小可以被下面的方式改變:

class  

a ;   //sizeof  

(a) 

= 12  

這個結果可能會讓你吃驚,因為a的成員總數是6個位元組:1+4+1個位元組。那另6位元組是哪兒來的?編譯器在每個bool成員後面都插入了3個填充位元組以保證每個成員都是按4位元組排列,以便分界。你可以減少a的大小,通過以下方式:  

class  

b ;   //  

sizeof  

(b)  = 

8  這一次,編譯器只在成員c後插入了2個位元組。因為b佔了4個位元組,所以就很自然地把它當作乙個字的形式排列,而a和c的大小1+1=2,再加上2個位元組就剛好按兩個字的形式排列b。

3、虛函式:如果有虛函式,類的大小+4個位元組。(用來存放vptr)

例:class  

a ;   sizeof(a)  

=  12  

=  vptr  

+  sizeof(i)  

+  (sizeof(c)  

+3);

class  

b  :public  

a sizeof(b)  

=  16  

=  sizeof(a)  

+  sizeof(ll);

4、虛基類指標:如果是虛繼承,則子類的大小為:虛基類的大小 + 4個位元組(用來存放指向虛基物件的指標)+子類新增成員的大小。

例: 

class a ;

int 

i; int j; };

class c: virtual public a

;sizeof(c) 

= sizeof(a) + 4 + 

sizeof(sz[10]) 

= 12+4+10+2(補齊sz)=28

feature map大小計算方法

1 邊長的計算公式是 output h originalsize h padding 2 kernelsize h stride 1 輸入大小為200 200,依次經過一層卷積 kernel size 5 5,padding 1,stride 2 pooling kernel size 3 3,pa...

結構體大小計算方法

原文 結構體中的成員可以是不同的資料型別,成員按照定義時的順序依次儲存在連續的記憶體空間。和陣列不一樣的是,結構體的大小不是所有成員大小簡單的相加,需要考慮到系統在儲存結構體變數時的位址對齊問題。看下面這樣的乙個結構體 struct stu1 實際上,由於儲存變數時位址對齊的要求,編譯器在編譯程式時...

c 類大小計算

先給出總結 以下測試均在x64系統執行 1 原則1 空類的大小為1位元組。includeusing namespace std class a int main int main virtual void fun2 int test1 static void test2 static int c s...