**:一、非靜態成員變數(普通成員變數)跟著類的物件走(存在物件內部),也就是每個類物件都有自己的成員變數。
#include using namespace std;
class a;
//類物件所佔的空間
記憶體位址 64 00 00 00 ,這四個位元組即為 物件aobj的記憶體位址,十六進製制 64 轉化為十進位制為數值 100,即 int a = 100;
二、靜態成員變數跟類的物件沒有什麼關係,所以肯定不會儲存在物件內部,是儲存在物件外面(表示所占用的記憶體空間和類物件無關)的。
#include using namespace std;
class a;
int main()
三、 成員函式:不管靜態的還是非靜態的,全部儲存在類物件之外。所以不管幾個成員函式,不管是否是靜態的成員函式,物件的sizeof()都是不增加的。
#include using namespace std;
class a
; //靜態成員函式
void myfunc() {}; //普通成員函式};
int main()
四、虛函式:不管幾個虛函式,sizeof()都是多了4個位元組。
#include using namespace std;
class a
; //虛函式 1
virtual void vfrandfunc21() {}; //虛函式2 };
int main()
結果分析:
(4.1)類裡只要有乙個虛函式(或者說至少有乙個虛函式),這個類 會產生乙個 指向 虛函式 的指標。
有兩個虛函式,那麼這個類 就會產生兩個指向虛函式的指標。
類本身 指向虛函式的 指標(乙個或者一堆)要有地方存放,存放在乙個**裡,這個**我們就稱為「虛函式表(virtual table【vtbl】)」;
這個虛函式表一般是儲存在可執行檔案中的,在程式執行的時候載入到記憶體中來。
虛函式表是基於類的,跟著類走的;
(4.2)說說類物件,這四個位元組的增加,其實是因為虛函式的存在;因為有了虛函式的存在,導致系統往類物件中新增了乙個指標, 這個指標正好指向這個虛函式表,很多資料上把這個指標叫vptr;這個vptr的值由系統在適當的時機(比如建構函式中通過增加額外的**來給值);
五、小結:(對於類中)
(1)靜態資料成員不計算在類物件sizeof()內;
(2)普通成員函式和靜態成員函式不計算在類物件的sizeof()內
(3)虛函式不計算在類物件的sizeof()內,但是虛函式會讓類物件的sizeof()增加4個位元組以容納虛函式表指標。
(4)虛函式表[vtbl]是基於類的(跟著類走的,跟物件沒關係,不是基於物件的);
(5)如果有多個資料成員,那麼為了提高訪問速度,某些編譯器可能會將資料成員之間的記憶體占用比例進行調整。(記憶體位元組對齊)
class a //由於位元組對齊,共占用8個位元組
;
(6)不管什麼型別指標char *p,int *q;,該指標占用的記憶體大小是固定的
例如:
int ilen2 = sizeof(char *); //占用4個位元組(linux下占用8個位元組)
int ilen3 = sizeof(int *); //占用4個位元組
六、程式設計實驗:
#include using namespace std;
class myobject
;//建構函式,不佔物件空間
virtual ~myobject() {}; //析構函式,產生虛函式表,佔4個位元組
float getvalue() const //普通成員函式不佔物件位元組
static int s_getcount() //靜態成員函式,不佔位元組
virtual void vfrandfunc() {}; //虛函式,只算乙個虛函式的4位元組(析構函式)
protected:
float m_value; //普通成員變數,佔4位元組
static int ms_scount; //靜態成員變數,不佔位元組,跟著類走};
int main()
結果分析:
成員變數m_value佔4位元組,虛函式表指標佔4位元組。
七、總結類物件大小的組成:
(1)非靜態成員變數所佔的記憶體總量以及這些成員變數之間內才能位元組對齊所額外占用的記憶體;
(2)若有虛函式,則會產生虛函式表指標(vptr)。
八、c++類的物件模型:
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...
1 1 物件模型
q1 c 的類有兩種資料成員 static 資料成員與 nonstatic 資料成員,有三種成員函式 static,nonstatic,virtual。q2 在虛繼承的情況下,base class不管在繼承串鏈中被派生多少次,永遠只會存在乙個例項 稱為subobject q3 c 物件模型。每個物件...