C++中的类所占内存空间总结
C++中的類所占內(nèi)存空間總結(jié)
最近在復(fù)習(xí)c++的一些基礎(chǔ),感覺這篇文章很不錯(cuò),轉(zhuǎn)載來,大家看看!類所占內(nèi)存的大小是由成員變量(靜態(tài)變量除外)決定的,成員函數(shù)(這是籠統(tǒng)的說,后面會(huì)細(xì)說)是不計(jì)算在內(nèi)的。
摘抄部分:
成員函數(shù)還是以一般的函數(shù)一樣的存在。a.fun()是通過fun(a.this)來調(diào)用的。所謂成員函數(shù)只是在名義上是類里的。其實(shí)成員函數(shù)的大小不在類的對(duì)象里面,同一個(gè)類的多個(gè)對(duì)象共享函數(shù)代碼。而我們?cè)L問類的成員函數(shù)是通過類里面的一個(gè)指針實(shí)現(xiàn),而這個(gè)指針指向的是一個(gè)table,table里面記錄的各個(gè)成員函數(shù)的地址(當(dāng)然不同的編譯可能略有不同的實(shí)現(xiàn))。所以我們?cè)L問成員函數(shù)是間接獲得地址的。所以這樣也就增加了一定的時(shí)間開銷,這也就是為什么我們提倡把一些簡短的,調(diào)用頻率高的函數(shù)聲明為inline形式(內(nèi)聯(lián)函數(shù))。
(一)
class CBase?
{?
};?
sizeof(CBase)=1;
為什么空的什么都沒有是1呢?
c++要求每個(gè)實(shí)例在內(nèi)存中都有獨(dú)一無二的地址。//注意這句話!!!!!!!!!!
空類也會(huì)被實(shí)例化,所以編譯器會(huì)給空類隱含的添加一個(gè)字節(jié),這樣空類實(shí)例化之后就有了獨(dú)一無二的地址了。所以空類的sizeof為1。
(二)
class CBase?
{?
int a;?
char p;?
};?
sizeof(CBase)=8;
記得對(duì)齊的問題。int 占4字節(jié)//注意這點(diǎn)和struct的對(duì)齊原則很像!!!!!
char占一字節(jié),補(bǔ)齊3字節(jié)
(三)
class CBase?
{?
public:?
CBase(void);?
virtual ~CBase(void);?
private:?
int? a;?
char *p;?
};?
再運(yùn)行:sizeof(CBase)=12
C++ 類中有虛函數(shù)的時(shí)候有一個(gè)指向虛函數(shù)的指針(vptr),在32位系統(tǒng)分配指針大小為4字節(jié)。無論多少個(gè)虛函數(shù),只有這一個(gè)指針,4字節(jié)。//注意一般的函數(shù)是沒有這個(gè)指針的,而且也不占類的內(nèi)存。
(四)
class CChild : public CBase?
{?
public:?
CChild(void);?
~CChild(void);?
virtual void test();
private:?
int b;?
};?
輸出:sizeof(CChild)=16;
可見子類的大小是本身成員變量的大小加上父類的大小。//其中有一部分是虛擬函數(shù)表的原因,一定要知道
父類子類共享一個(gè)虛函數(shù)指針
(五)
#include<iostream.h>
class a {};
class b{};
class c:public a{
virtual void fun()=0;
};
class d:public b,public c{};
int main()
{
cout<<"sizeof(a)"<<sizeof(a)<<endl;
cout<<"sizeof(b)"<<sizeof(b)<<endl;
cout<<"sizeof(c)"<<sizeof(c)<<endl;
cout<<"sizeof(d)"<<sizeof(d)<<endl;
return 0;}
程序執(zhí)行的輸出結(jié)果為:
sizeof(a) =1
sizeof(b)=1
sizeof(c)=4
sizeof(d)=8
前三種情況比較常見,注意第四種情況。類d的大小更讓初學(xué)者疑惑吧,類d是由類b,c派生邇來的,它的大小應(yīng)該為二者之和5,為什么卻是8 呢?這是因?yàn)闉榱颂岣邔?shí)例在內(nèi)存中的存取效率.類的大小往往被調(diào)整到系統(tǒng)的整數(shù)倍.并采取就近的法則,里哪個(gè)最近的倍數(shù),就是該類的大小,所以類d的大小為8個(gè)字節(jié).
總結(jié):
空的類是會(huì)占用內(nèi)存空間的,而且大小是1,原因是C++要求每個(gè)實(shí)例在內(nèi)存中都有獨(dú)一無二的地址。
(一)類內(nèi)部的成員變量:
- 普通的變量:是要占用內(nèi)存的,但是要注意對(duì)齊原則(這點(diǎn)和struct類型很相似)。
- static修飾的靜態(tài)變量:不占用內(nèi)容,原因是編譯器將其放在全局變量區(qū)。
(二)類內(nèi)部的成員函數(shù):
- 普通函數(shù):不占用內(nèi)存。
- 虛函數(shù):要占用4個(gè)字節(jié),用來指定虛函數(shù)的虛擬函數(shù)表的入口地址。所以一個(gè)類的虛函數(shù)所占用的地址是不變的,和虛函數(shù)的個(gè)數(shù)是沒有關(guān)系的
-
說明:此博文轉(zhuǎn)載之http://blog.sina.com.cn/s/blog_69c189bf0100mkeu.html
好記性不如爛筆頭!!
轉(zhuǎn)載于:https://www.cnblogs.com/acSzz/p/4170602.html
總結(jié)
以上是生活随笔為你收集整理的C++中的类所占内存空间总结的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: postgresql - mac 启动
- 下一篇: c++类对象 指针区别