而我們訪問類的成員函式是通過類裡面的乙個指標實現,而這個指標指向的是乙個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;
可見子類的大小是本身成員變數的大小加上父類的大小。
(五)
#includeclass a {};
class b{};
class c:public a;
class d:public b,public c{};
int main()
{cout<<"sizeof(a)"《程式執行的輸出結果為:
sizeof(a) =1
sizeof(b)=1
sizeof(c)=4
sizeof(d)=4
此處主要考慮記憶體對齊,參考c/c++ 記憶體對齊原則及作用
總結:空的類是會占用記憶體空間的,而且大小是1,原因是c++要求每個例項在記憶體中都有獨一無二的位址。
(一)類內部的成員變數:
普通的變數:是要占用記憶體的,但是要注意對齊原則(這點和struct型別很相似)。
static修飾的靜態變數:不占用內容,原因是編譯器將其放在全域性變數區。
(二)類內部的成員函式:
普通函式:不占用記憶體。
虛函式:要占用4個位元組,用來指向虛函式表的虛表指標。
C 中的類所佔記憶體空間總結
類所佔記憶體的大小是由成員變數 靜態變數除外 決定的,成員函式 這是籠統的說,後面會細說 是不計算在內的。摘抄部分 成員函式還是以一般的函式一樣的存在。a.fun 是通過fun a.this 來呼叫的。所謂成員函式只是在名義上是類裡的。其實成員函式的大小不在類的物件裡面,同乙個類的多個物件共享函式 ...
C 中的類所佔記憶體空間總結
類所佔記憶體的大小是由成員變數 靜態變數除外 決定的,成員函式 這是籠統的說,後面會細說 是不計算在內的。摘抄部分 成員函式還是以一般的函式一樣的存在。a.fun 是通過fun a.this 來呼叫的。所謂成員函式只是在名義上是類裡的。其實成員函式的大小不在類的物件裡面,同乙個類的多個物件共享函式 ...
C 中的類所佔記憶體空間總結
類所佔記憶體的大小是由成員變數 靜態變數除外 決定的,成員函式 這是籠統的說,後面會細說 是不計算在內的。示例如下 一 class cbase sizeof cbase 1 為什麼空的類什麼都沒有是 1 呢?c 要求每個例項在記憶體中都有獨一無二的位址。空類也會被例項化,所以編譯器會給空類隱含的新增...