c 類占用記憶體大小計算

2021-06-26 05:50:51 字數 3687 閱讀 9696

c++類所佔記憶體大小計算

說明:筆者的作業系統是32位的。

class a {}; 

sizeof( a ) = ?

sizeof( a ) = 1

明明是空類,為什麼編譯器說它是1呢?

空類同樣可以例項化,每個例項在記憶體中都有乙個獨一無二的位址,為了達到這個目的,編譯器往往會給乙個空類隱含的加乙個位元組,這樣空類在例項化後在記憶體得到了獨一無二的位址.所以sizeof( a )的大小為1.

class b 

~b() {}

void memberfunctest( int para )

static void staticmemfunctest( int para )

};sizeof( b ) = ?

sizeof( b ) = 1

類的非虛成員函式是不計算在內的,不管它是否靜態。

class c 

virtual ~c() {}

};sizeof( b ) = ?

sizeof( b ) = 4

類d有乙個虛函式,存在虛函式的類都有乙個一維的虛函式表叫虛表,虛表裡存放的就是虛函式的位址了,因此,虛表是屬於類的。這樣的類物件的前四個位元組是乙個指向虛表的指標,類內部必須得儲存這個虛表的起始指標。在32位的系統分配給虛表指標的大小為4個位元組,所以最後得到類c的大小為4.

class d 

virtual ~d() {}

virtual int virtualmemfunctest1()=0;

virtual int virtualmemfunctest2()=0;

virtual int virtualmemfunctest3()=0;

};sizeof( d ) = ?

sizeof( d ) = 4

原理同類c,不管類裡面有多少個虛函式,類內部只要儲存虛表的起始位址即可,虛函式位址都可以通過偏移等演算法獲得。

class e

;sizeof( e ) = ?

sizeof( e ) = 8

32位的作業系統int佔4個位元組,char佔乙個位元組,加上記憶體對齊的3位元組,為8位元組。

class f : public e

;int f::s_data=100;

sizeof( f ) = ?

sizeof( f ) = 8

類f為什麼跟類e一樣大呢?類f的靜態資料成員被編譯器放在程式的乙個global data members中,它是類的乙個資料成員,但是它不影響類的大小,不管這個類實際產生了多少例項還是派生了多少新的類,靜態成員資料在類中永遠只有乙個實體存在,而類的非靜態資料成員只有被例項化的時候,他們才存在.但是類的靜態資料成員一旦被宣告,無論類是否被例項化,它都已存在.可以這麼說,類的靜態資料成員是一種特殊的全域性變數.

class g : public e

;class h : public g

;sizeof( g ) = ?

sizeof( h ) = ?

sizeof( g ) = 16

sizeof( h ) = 20

可以看出子類的大小是本身成員的大小再加上父類成員的大小.如果父類還有父類,也加上父類的父類,這樣一直遞迴下去。

class i : public d

;sizeof( i ) = ?

sizeof( i ) = 4

父類子類工享乙個虛函式指標,虛函式指標保留乙個即可。

總結:空的類也是會占用記憶體空間的,而且大小是1,原因是c++要求每個例項在記憶體中都有獨一無二的位址。

(一)類內部的成員變數:

普通的變數:是要占用記憶體的,但是要注意記憶體對齊(這點和struct型別很相似)。

static修飾的靜態變數:不占用記憶體,原因是編譯器將其放在全域性變數區。

從父類繼承的變數:計算進子類中

(二)類內部的成員函式:

非虛函式(建構函式、靜態函式、成員函式等):不占用記憶體。

虛函式:要占用4個位元組(32位的作業系統),用來指定虛函式表的入口位址。跟虛函式的個數沒有關係。父類子類工享乙個虛函式指標。

構成物件本身的只有資料,任何成員函式都不隸屬於任何乙個物件,非靜態成員函式與物件的關係就是繫結,繫結的中介就是this指標。成員函式為該類所有物件共享,不僅是處於簡化語言實現、節省儲存的目的,而且是為了使同類物件有一致的行為。同類物件的行為雖然一致,但是操作不同的資料成員。

測試**如下:

[cpp]view plain

copy

print?

"font-size:18px;"

>

/** file name   : main.cpp

* description : test the size of c++'s class

* create on   : 2012-05-31

* create by   : chenchong

* email         : [email protected]

*/#include

using

namespace

std;  

class

a {};   

class

b   

~b() {}  

void

memberfunctest( 

intpara )   

static

void

staticmemfunctest( 

intpara )  

};  

class

c   

virtual

~c() {}  

};  

class

d   

virtual

~d() {}  

virtual

intvirtualmemfunctest1()=0;  

virtual

intvirtualmemfunctest2()=0;  

virtual

intvirtualmemfunctest3()=0;  

};  

class

e  ;  

class

f : 

public

e  ;  

intf::s_data=100;  

class

g : 

public

e  ;  

class

h : 

public

g  ;  

class

i : 

public

d  ;  

intmain( 

intargc, 

char

**argv )    

windows 7 32位 vc 2010執行結果:

linux(cent os 6.2 32位)執行結果:

另外:

C 類所佔記憶體大小計算

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

虛 繼承類的記憶體大小計算

虛函式的工作原理涉及到了虛函式表指標vptr和虛函式表vtbl,當乙個物件呼叫了虛函式,實際的被呼叫函式通過下面的步驟確定 找到物件的 vptr 指向的 vtbl,然後在 vtbl 中尋找合適的函式指標。如果類定義了虛函式,該類及其派生類就要生成一張虛函式表,即vtable。而在類的物件位址空間中儲...

類的占用記憶體大小

1.類的大小為類的非靜態成員資料的型別大小之和,也 就是說靜態成員資料不作考慮。2.普通成員函式與sizeof無關。3.靜態成員並不屬於某個物件,sizeof取的是物件大小。4.虛函式由於要維護在虛函式表,所以要佔據乙個指標大小,也就是4位元組。5.空類的sizeof為1。因為乙個空類也要例項化,所...