類占用空間的計算

2021-08-04 17:00:54 字數 851 閱讀 7750

例如

class c;

sizeof(類)計算的是類中存在棧中的變數的大小,而類中的b和*c都是static靜態變數,存在全域性區中,因此不在計算範圍之內,於是只剩下char a,  void *p和兩個virtual虛函式,a是char型別,占用乙個位元組,p是指標,在64位系統的指標占用8個位元組,而兩個虛函式只需要乙個虛函式表指標,也是八個位元組,加上類中的對齊方式(char a對齊時後面補上7個位元組),故答案為24.

類只是一種型別定義,它本身是沒有大小可言的。 因此,如果用sizeof運算子對乙個型別名操作,那得到的是具有該型別實體的大小。

計算乙個類物件的大小時的規律:

1、空類、單一繼承的空類、多重繼承的空類所佔空間大小為:1(位元組,下同);

2、乙個類中,虛函式本身、成員函式(包括靜態與非靜態)和靜態資料成員都是不占用類物件的儲存空間的;

3、因此乙個物件的大小≥所有非靜態成員大小的總和; 

4、當類中宣告了虛函式(不管是1個還是多個),那麼在例項化物件時,編譯器會自動在物件裡安插乙個指標vptr

指向虛函式表vtable;

5、虛承繼的情況:由於涉及到虛函式表和虛基表,會同時增加乙個(多重虛繼承下對應多個)vfptr指標指向虛函式表

vftable和乙個vbptr指標指向虛基表vbtable,這兩者所佔的空間大小為:8(或8乘以多繼承時父類的個數);

6、在考慮以上內容所佔空間的大小時,還要注意編譯器下的「補齊」padding的影響,即編譯器會插入多餘的位元組補齊;

類物件的大小=各非靜態資料成員(包括父類的非靜態資料成員但都不包括所有的成員函式)的總和+ 

vfptr指標(多繼承下可能不止乙個)+vbptr指標(多繼承下可能不止乙個)+編譯器額外增加的位元組。

C 類占用空間計算方式

1 乙個類占用的空間主要是屬性占用空間,而成員函式一般不占用空間,但是虛函式占用空間,需要說明的是,無論多少個虛函式,只要占用4個位元組即可,也就是索引指向乙個虛擬表的首位置。另外需要說明的是占用空間都考慮了對齊,所以不足4個的按照滿4個的算。2 類的繼承,子類占用空間是父類基礎上增加本類空間即可。...

C 類占用空間計算方式

1 乙個類占用的空間主要是屬性占用空間,而成員函式一般不占用空間,但是虛函式占用空間,需要說明的是,無論多少個虛函式,只要占用4個位元組即可,也就是索引指向乙個虛擬表的首位置。另外需要說明的是占用空間都考慮了對齊,所以不足4個的按照滿4個的算。2 類的繼承,子類占用空間是父類基礎上增加本類空間即可。...

SQL Server計算列是否占用空間

今天看網上有個問題 sql server計算列是否占用空間 其實這個問題查一下msdn或者bol就可以知道結果了 在建立計算列的時候有乙個引數可以指定persisted。使用這個引數可以指定資料庫引擎將在表中物理儲存計算值,並在計算列依賴的任何其他列發生更新時對這些計算值進行更新。而且將計算列標記為...