(1)非靜態的成員變數(普通成員變數)跟著類物件走(存在物件內部),也就是每個類物件都有自己的成員變數;
下面這個類佔8位元組
class a
;
(2)靜態成員變數跟物件沒有什麼關係,所以肯定不會儲存在物件內部,是儲存在物件外面(表示所占用的記憶體空間和類物件無關)的。
再加入乙個靜態成員之後,類還是8個位元組,說明靜態成員不會儲存在物件內部.
class a
;int a::sa = 12;
(3)成員函式:不管靜態的還是非靜態,全部都儲存在類物件之外。所以不管幾個成員函式,不管是否是靜態的成員函式,物件的sizeof的大小都是不增加的;
加入乙個普通成員函式和乙個靜態成員函式之後 該類還是佔8個位元組
class a
; static int func1()
;};
(4)虛函式:不管幾個虛函式,sizeof()都是多了4個位元組(32位是多4位元組)。
這個類佔了12位元組
class a
; static int func1()
; virtual void vtest() };
int a::sa = 12;
(5)位元組對齊
class a
; static int func1()
; //virtual void vtest()
//};
int a::sa = 12;
char本身佔乙個位元組,但加入乙個char型別的變數之後,該類的大小變成了12位元組,增加了4位元組 ,這是因為編譯器為了提高訪問速度,進行了記憶體對齊,32位是預設按照4位元組對齊的.
在類定義上面加上#pragma pack(1)
#pragma pack(1)
class a
; static int func1()
; //virtual void vtest()
//};
int a::sa = 12;
結果是該類佔了9個位元組,#pragma pack(1) 意識是按1位元組對齊 .
總結:
靜態資料成員不計算在類物件sizeof()內;
普通成員函式和靜態成員函式不計算在類物件的sizeof()內
虛函式不計算在類物件的sizeof()內,但是虛函式會讓類物件的sizeof()增加4個位元組以容納虛函式表指標。
虛函式表[vtbl]是基於類的(跟著類走的,跟物件沒關係,不是基於物件的);
如果有多個資料成員,那麼為了提高訪問速度,某些編譯器可能會將資料成員之間的記憶體占用比例進行調整。(記憶體位元組對齊)
不管什麼型別指標char *p,int *q;,該指標占用的記憶體大小是固定的
c 物件模型探索2 2 物件結構的發展和演化
一 非靜態成員變數 普通成員變數 跟著類的物件走 存在物件內部 也就是每個類物件都有自己的成員變數。include using namespace std class a 類物件所佔的空間 記憶體位址 64 00 00 00 這四個位元組即為 物件aobj的記憶體位址,十六進製制 64 轉化為十進位...
22 物件的銷毀
注 部落格中內容主要來自 狄泰軟體學院 部落格僅當私人筆記使用。測試環境 ubuntu 10.10 gcc版本 4.4.5 一 物件的銷毀 1 生活中的物件都是被初始化後才上市的 2 生活中的物件被銷毀前會做一些清理工作 問題 c 中的如何清理需要銷毀的物件 3 一般而言,需要銷毀的物件都應該清理 ...
C 22 物件的銷毀
問題 c 中如何清理需要銷毀的物件呢?class test void free c 編譯器是否能夠自動呼叫某個特殊的函式進行物件的清理呢?定義 classname include class test test test t3 3 int main 輸出 test int i i 3 test in...