空型別所佔記憶體大小

2021-07-22 07:52:54 字數 1400 閱讀 3932

成員函式還是以一般的函式一樣的存在。a.fun()是通過fun(a.this)來呼叫的。所謂成員函式只是在名義上是類裡的。其實成員函式的大小不在類的物件裡面,類所佔記憶體的大小不包括成員函式的大小,虛擬成員函式除外。同乙個類的多個物件共享函式**。而我們訪問類的成員函式是通過類裡面的乙個指標實現,而這個指標指向的是乙個table,table裡面記錄的各個成員函式的位址(當然不同的編譯可能略有不同的實現)。所以我們訪問成員函式是間接獲得位址的。所以這樣也就增加了一定的時間開銷,這也就是為什麼我們提倡把一些簡短的,呼叫頻率高的函式宣告為inline形式(內聯函式)。

(一)

class cbase 

; sizeof(cbase)=1;

為什麼空的什麼都沒有是1呢?

c++要求每個例項在記憶體中都有獨一無二的位址。//注意這句話!!!!!!!!!!

空類也會被例項化,所以編譯器會給空類隱含的新增乙個位元組,這樣空類例項化之後就有了獨一無二的位址了。所以空類的sizeof為1。

(二)

class cbase 

; sizeof(cbase)=8;

記得對齊的問題。int 佔4位元組//注意這點和struct的對齊原則很像!!!!!

char佔一位元組,補齊3位元組

(三)

class cbase 

;

再執行:sizeof(cbase)=12

c++ 類中有虛函式的時候有乙個指向虛函式的指標(vptr),在32位系統分配指標大小為4位元組。

無論多少個虛函式,只有這乙個指標,4位元組。//注意一般的函式是沒有這個指標的,而且也不佔類的記憶體。

(四)

class cchild : public cbase 

;

輸出:sizeof(cchild)=16;

可見子類的大小是本身成員變數的大小加上父類的大小。

//其中有一部分是虛函式表的原因,一定要知道父類子類共享乙個虛函式指標

總結:

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

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

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

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

普通函式:不占用記憶體。虛函式:要占用4個位元組,用來指定虛函式的虛函式表的入口位址。所以乙個類的虛函式所占用的位址是不變的,和虛函式的個數是沒有關係的。

c 空類所佔記憶體大小問題

先看乙個例子 include using namespace std class a class b class e class c public a class d public b,public c int main cout 為什麼會出現這種結果呢?首先要出需要多少記憶體表現乙個類說起 一般而...

iOS基本資料型別所佔記憶體大小

1 在swift中基本的資料型別都有哪些?float cgfloat double float t float32 float64 float80 double t int int fast8 t int fast16 t int fast32 t int fast64 t intmax t nsi...

空類所佔記憶體的大小

成員函式還是以一般的函式一樣的存在。a.fun 是通過fun a.this 來呼叫的。所謂成員函式只是在名義上是類裡的。其實成員函式的大小不在類的物件裡面,類所佔記憶體的大小不包括成員函式的大小,虛擬成員函式除外。同乙個類的多個物件共享函式 而我們訪問類的成員函式是通過類裡面的乙個指標實現,而這個指...