C 類的例項中 記憶體分配詳解

2022-03-29 19:42:23 字數 1625 閱讀 5766

乙個類,有成員變數:靜態與非靜態之分;而成員函式有三種:靜態的、非靜態的、虛的。

那麼這些個東西在記憶體中到底是如何分配的呢?

以乙個例子來說明:

#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 base  

private:

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 程式設計中的記憶體分配。一 記憶體基本構成 可程式設計內存在基本上分為這樣的幾大部分 靜態儲存區 堆區和棧區。他們的功能不同,對他們使用方式也就不同。靜態儲存區 內存在程式編譯的時候就已經分配好,這塊內存在程式的整個執行期間都存在。它主要存放靜態資...