C++中的类所占内存空间总结
C++中的類所占內(nèi)存空間總結(jié)
最近在復(fù)習(xí)c++的一些基礎(chǔ),感覺這篇文章很不錯,轉(zhuǎn)載來,大家看看!類所占內(nèi)存的大小是由成員變量(靜態(tài)變量除外)決定的,成員函數(shù)(這是籠統(tǒng)的說,后面會細說)是不計算在內(nèi)的。
摘抄部分:
成員函數(shù)還是以一般的函數(shù)一樣的存在。a.fun()是通過fun(a.this)來調(diào)用的。所謂成員函數(shù)只是在名義上是類里的。其實成員函數(shù)的大小不在類的對象里面,同一個類的多個對象共享函數(shù)代碼。而我們訪問類的成員函數(shù)是通過類里面的一個指針實現(xiàn),而這個指針指向的是一個table,table里面記錄的各個成員函數(shù)的地址(當(dāng)然不同的編譯可能略有不同的實現(xiàn))。所以我們訪問成員函數(shù)是間接獲得地址的。所以這樣也就增加了一定的時間開銷,這也就是為什么我們提倡把一些簡短的,調(diào)用頻率高的函數(shù)聲明為inline形式(內(nèi)聯(lián)函數(shù))。
(一)
class CBase?
{?
};?
sizeof(CBase)=1;
為什么空的什么都沒有是1呢?
c++要求每個實例在內(nèi)存中都有獨一無二的地址。//注意這句話!!!!!!!!!!
空類也會被實例化,所以編譯器會給空類隱含的添加一個字節(jié),這樣空類實例化之后就有了獨一無二的地址了。所以空類的sizeof為1。
(二)
class CBase?
{?
int a;?
char p;?
};?
sizeof(CBase)=8;
記得對齊的問題。int 占4字節(jié)//注意這點和struct的對齊原則很像!!!!!
char占一字節(jié),補齊3字節(jié)
(三)
class CBase?
{?
public:?
CBase(void);?
virtual ~CBase(void);?
private:?
int? a;?
char *p;?
};?
再運行:sizeof(CBase)=12
C++ 類中有虛函數(shù)的時候有一個指向虛函數(shù)的指針(vptr),在32位系統(tǒng)分配指針大小為4字節(jié)。無論多少個虛函數(shù),只有這一個指針,4字節(jié)。//注意一般的函數(shù)是沒有這個指針的,而且也不占類的內(nèi)存。
(四)
class CChild : public CBase?
{?
public:?
CChild(void);?
~CChild(void);?
virtual void test();
private:?
int b;?
};?
輸出:sizeof(CChild)=16;
可見子類的大小是本身成員變量的大小加上父類的大小。//其中有一部分是虛擬函數(shù)表的原因,一定要知道
父類子類共享一個虛函數(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 呢?這是因為為了提高實例在內(nèi)存中的存取效率.類的大小往往被調(diào)整到系統(tǒng)的整數(shù)倍.并采取就近的法則,里哪個最近的倍數(shù),就是該類的大小,所以類d的大小為8個字節(jié).
總結(jié):
空的類是會占用內(nèi)存空間的,而且大小是1,原因是C++要求每個實例在內(nèi)存中都有獨一無二的地址。
(一)類內(nèi)部的成員變量:
- 普通的變量:是要占用內(nèi)存的,但是要注意對齊原則(這點和struct類型很相似)。
- static修飾的靜態(tài)變量:不占用內(nèi)容,原因是編譯器將其放在全局變量區(qū)。
(二)類內(nèi)部的成員函數(shù):
- 普通函數(shù):不占用內(nèi)存。
- 虛函數(shù):要占用4個字節(jié),用來指定虛函數(shù)的虛擬函數(shù)表的入口地址。所以一個類的虛函數(shù)所占用的地址是不變的,和虛函數(shù)的個數(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 启动
- 下一篇: css截断长文本显示