c++類所佔記憶體大小計算
文章出處:
作者****:[email protected]
說明:筆者的作業系統是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 類所佔記憶體大小計算 說明 筆者的作業系統是32位的。class a sizeof a sizeof a 1 明明是空類,為什麼編譯器說它是1呢?空類同樣可以例項化,每個例項在記憶體中都有乙個獨一無二的位址,為了達到這個目的,編譯器往往會給乙個空類隱含的加乙個位元組,這樣空類在例項化後在記憶體得...
虛 繼承類的記憶體大小計算
虛函式的工作原理涉及到了虛函式表指標vptr和虛函式表vtbl,當乙個物件呼叫了虛函式,實際的被呼叫函式通過下面的步驟確定 找到物件的 vptr 指向的 vtbl,然後在 vtbl 中尋找合適的函式指標。如果類定義了虛函式,該類及其派生類就要生成一張虛函式表,即vtable。而在類的物件位址空間中儲...
c 空類所佔記憶體大小問題
先看乙個例子 include using namespace std class a class b class e class c public a class d public b,public c int main cout 為什麼會出現這種結果呢?首先要出需要多少記憶體表現乙個類說起 一般而...