乙個類,有成員變數:靜態與非靜態之分;而成員函式有三種:靜態的、非靜態的、虛的。
那麼這些個東西在記憶體中到底是如何分配的呢?
以乙個例子來說明:
#include"iostream.h"class cobject
;voidcobject::fun();
這個類用sizeof()測出來的大小是 2*sizeof(double)=16
class cobject
; 大小是2*sizeof(int)=8
class cobject
; sizeof(char)+sizeof(int) 其實這裡還有乙個是記憶體對齊的問題。
空類大小是1。
另外要注意的一些問題:
先看乙個空的類佔多少空間?
class base
; class base ;
注意到我這裡顯示宣告了構造跟析構,但是sizeof(base)的結果是1.
因為乙個空類也要例項化,所謂類的例項化就是在記憶體中分配一塊位址,每個例項在記憶體中都有獨一無二的位址。同樣空類也會被例項化,所以編譯器會給空類隱含 的新增乙個位元組,這樣空類例項化之後就有了獨一無二的位址了。所以空類的sizeof為1。
而析構函式,跟建構函式這些成員函式,是跟sizeof無關的,也不難理解因為我們的sizeof是針對例項,而普通成員函式,是針對類體的,乙個類的成 員函式,多個例項也共用相同的函式指標,所以自然不能歸為例項的大小,這在我的另一篇博文有提到。
接著看下面一段**
class baseprivate:
int a; //佔4位元組
char *p; //4位元組指標
};
class derive:public base
;
~derive(){};
private:
static int st; //非例項獨佔
int d; //佔4位元組
char *p; //4位元組指標
};
int main()
; ~derive(){};
private:
static int st;
int d;
char *p;
char c;
}; class derive:public base ;
~derive(){};
private:
static int st;
int d;
char *p;
char c;
};
這個時候,結果就變成了
24
乙個char c;增加了4位元組,說明類的大小也遵守類似class位元組對齊,補齊規則。
至此,我們可以歸納以下幾個原則:
1.類的大小為類的非靜態成員資料的型別大小之和,也就是說靜態成員資料不作考慮。
2.普通成員函式與sizeof無關。
c 類例項在記憶體中的分配
c 是一種物件導向的程式語言,它向下保持了對c的相容,同時也允許程式設計師能夠自由的操控記憶體,雖然會帶來一些問題,但這不是我們要 的問題,略過不表。類是對某種物件的定義,包含變數和方法,也可以理解為現實生活中一類具有共同特徵的事務的抽象,他是物件導向語言的基礎。所以類是不占有記憶體的,可是如果類生...
C 類例項化時的記憶體分配
初學者在學習物件導向的程式語言時,或多或少的都些疑問,我們寫的 與最終生編譯成的 卻大相徑庭,我們並不知道編譯器在後台做了什麼工作 這些都是由於我們僅停留在語言層的原因,所謂語言層就是教會我們一些基本的語法法則,但不會告訴我們為什麼這麼做?今天和大家談的一點感悟就是我在學習程式設計過程中的一點經驗,...
C 中記憶體分配詳解
程式執行時,特別要注意的是記憶體的分配。下面介紹c 程式設計中的記憶體分配。一 記憶體基本構成 可程式設計內存在基本上分為這樣的幾大部分 靜態儲存區 堆區和棧區。他們的功能不同,對他們使用方式也就不同。靜態儲存區 內存在程式編譯的時候就已經分配好,這塊內存在程式的整個執行期間都存在。它主要存放靜態資...