C 中類所佔的記憶體大小以及成員函式的儲存位置

2021-10-11 11:18:45 字數 2772 閱讀 9797

類所佔記憶體的大小是由成員變數(靜態變數除外)決定的,虛函式指標和虛基類指標也屬於資料部分,成員函式是不計算在內的。因為在編譯器處理後,成員變數和成員函式是分離的。成員函式還是以一般的函式一樣的存在。a.fun()是通過fun(a.this)來呼叫的。所謂成員函式只是在名義上是類裡的。

其實成員函式的大小不在類的物件裡面,同乙個類的多個物件共享函式**

而我們訪問類的成員函式是通過類裡面的乙個指標實現,而這個指標指向的是乙個table,table裡面記錄的各個成員函式的位址(當然不同的編譯可能略有不同的實現)。所以我們訪問成員函式是間接獲得位址的。所以這樣也就增加了一定的時間開銷,這也就是為什麼我們提倡把一些簡短的,呼叫頻率高的函式宣告為inline形式(內聯函式)。

class

cbase

;// sizeof(cbase)=1;

為什麼空的什麼都沒有是1呢?

c++要求每個例項在記憶體中都有獨一無二的位址。空類也會被例項化,所以編譯器會給空類隱含的新增乙個位元組,這樣空類例項化之後就有了獨一無二的位址了。所以空類的sizeof為1。

class

cbase

;// sizeof(cbase)=8;

位元組對齊的問題。int 佔4位元組

char佔一位元組,補齊3位元組

class

cbase

;// sizeof(cbase)=12

c++ 類中有虛函式的時候有乙個指向虛函式的指標(vptr),在32位系統分配指標大小為4位元組。無論多少個虛函式,只有這乙個指標,4位元組。

//注意一般的函式是沒有這個指標的,而且也不佔類的記憶體。

class

cchild

:public cbase

;// sizeof(cchild)=16;

可見子類的大小是本身成員變數的大小加上父類的大小。

//其中有一部分是虛函式表的原因,一定要知道父類子類共享乙個虛函式指標

classa;

// sizeof(a)=1

classb;

// sizeof(b)=1

classc:

public a

;// sizeof(c)=4

classd:

public b,

public c

;// sizeof(d)=8

類d的大小更讓人疑惑吧,類d是由類b,c派生過來的,它的大小應該為二者之和5,為什麼卻是8 呢?這是因為為了提高例項在記憶體中的訪問效率。類的大小往往被調整到系統的整數倍。並採取就近的法則,距離哪個最近的倍數,就是該類的大小,所以類d的大小為8個位元組。

// *****= 測試一 *****=

class

test

;test t21;

cout <<

sizeof

(t21)

<< endl;

// 執行結果:8

// *****= 測試二 *****=

class

test

//普通成員

intfunc0()

//友元函式

friend

intfunc1()

;//常成員函式

intfunc2()

const

//內聯函式

inline

void

func3()

//靜態成員函式

static

void

func4()

//析構函式

~test()

private

:int n;

char c;

short s;};

intfunc1()

test t22;

cout <<

sizeof

(t22)

<< endl;

// 執行結果:8

// *****= 測試三 *****=

class

test

intfunc0()

friend

intfunc1()

;int

func2()

const

inline

void

func3()

static

void

func4()

//虛函式,需要乙個虛函式指標的開銷

virtual

void

func5()

~test()

private

:int n;

char c;

short s;};

intfunc1()

test t23;

cout <<

sizeof

(t23)

<< endl;

// x86目標平台執行結果:12;x64目標平台下執行結果:16

因 c++中成員函式和非成員函式都是存放在**區的,故類中一般成員函式、友元函式,內聯函式還是靜態成員函式都不計入類的記憶體空間,測試一和測試二對比可證明這一點

測試三中,因出現了虛函式,故類要維護乙個指向虛函式表的指標,分別在 x86目標平台和x64目標平台下編譯執行的結果可證明這一點

綜上所述

c++ 類在記憶體中的儲存方式

C 類所佔記憶體大小計算

c 類所佔記憶體大小計算 文章出處 作者 vision chen yeah.net 說明 筆者的作業系統是32位的。class a sizeof a sizeof a 1 明明是空類,為什麼編譯器說它是1呢?空類同樣可以例項化,每個例項在記憶體中都有乙個獨一無二的位址,為了達到這個目的,編譯器往往會...

c 空類所佔記憶體大小問題

先看乙個例子 include using namespace std class a class b class e class c public a class d public b,public c int main cout 為什麼會出現這種結果呢?首先要出需要多少記憶體表現乙個類說起 一般而...

類所佔記憶體的大小

成員函式還是以一般的函式一樣的存在。a.fun 是通過fun a.this 來呼叫的。所謂成員函式只是在名義上是類裡的。其實成員函式的大小不在類的物件裡面,類所佔記憶體的大小不包括成員函式的大小,虛擬成員函式除外。同乙個類的多個物件共享函式 而我們訪問類的成員函式是通過類裡面的乙個指標實現,而這個指...