轉:C++中的類所佔記憶體空間總結

來源:互聯網
上載者:User

 類所佔記憶體的大小是由成員變數(靜態變數除外)決定的,成員函數(這是籠統的說,後面會細說)是不計算在內的。

摘抄部分:     成員函數還是以一般的函數一樣的存在。a.fun()是通過fun(a.this)來調用的。所謂成員函數只是在名義上是類裡的。其實成員函數的大小不在類的對象裡面,同一個類的多個對象共用函數代碼。而我們訪問類的成員函數是通過類裡面的一個指標實現,而這個指標指向的是一個table,table裡面記錄的各個成員函數的地址(當然不同的編譯可能略有不同的實現)。所以我們訪問成員函數是間接獲得地址的。所以這樣也就增加了一定的時間開銷,這也就是為什麼我們提倡把一些簡短的,調用頻率高的函式宣告為inline形式(內嵌函式)。

(一)
class CBase
{
};
sizeof(CBase)=1;

為什麼空的什麼都沒有是1呢?
c++要求每個執行個體在記憶體中都有獨一無二的地址。//注意這句話!!!!!!!!!!
空類也會被執行個體化,所以編譯器會給空類隱含的添加一個位元組,這樣空類執行個體化之後就有了獨一無二的地址了。所以空類的sizeof為1。

(二)

class CBase
{
int a;
char p;
};
sizeof(CBase)=8;
記得對齊的問題。int 佔4位元組//注意這點和struct的對齊原則很像!!!!!
char佔一位元組,補齊3位元組

 

(三)
class CBase
{
public:
CBase(void);
virtual ~CBase(void);
private:
int a;
char *p;
};
再運行:sizeof(CBase)=12

C++ 類中有虛函數的時候有一個指向虛函數的指標(vptr),在32位系統分配指標大小為4位元組。無論多少個虛函數,只有這一個指標,4位元組。//注意一般的函數是沒有這個指標的,而且也不佔類的記憶體。

 

 

(四)
class CChild : public CBase
{
public:
CChild(void);
~CChild(void);

virtual void test();
private:
int b;
};
輸出:sizeof(CChild)=16;
可見子類的大小是本身成員變數的大小加上父類的大小。//其中有一部分是虛擬函數表的原因,一定要知道

父類子類共用一個虛函數指標

(五)

 

#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;}程式執行的輸出結果為:sizeof(a) =1sizeof(b)=1sizeof(c)=4sizeof(d)=8前三種情況比較常見,注意第四種情況。類d的大小更讓初學者疑惑吧,類d是由類b,c派生邇來的,它的大小應該為二者之和5,為什麼卻是8 呢?這是因為為了提高執行個體在記憶體中的存取效率.類的大小往往被調整到系統的整數倍.並採取就近的法則,裡哪個最近的倍數,就是該類的大小,所以類d的大小為8個位元組.

 

總結:

空的類是會佔用記憶體空間的,而且大小是1,原因是C++要求每個執行個體在記憶體中都有獨一無二的地址。

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

 

  • 普通的變數:是要佔用記憶體的,但是要注意對齊原則(這點和struct類型很相似)。
  • static修飾的靜態變數:不佔用內容,原因是編譯器將其放在全域變數區。

 

 

 

(二)類內部的成員函數:
  • 普通函數:不佔用記憶體。
  • 虛函數:要佔用4個位元組,用來指定虛函數的虛擬函數表的入口地址。所以一個類的虛函數所佔用的地址是不變的,和虛函數的個數是沒有關係的。
原文:http://blog.sina.com.cn/s/blog_69c189bf0100mkeu.html
相關文章

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.