類所佔記憶體的大小是由成員變數
(靜態變數除外
)決定的,
成員函式
是不計算在內的。
成員函式還是以一般的函式一樣的存在。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;
可見子類的大小是本身成員變數的大小加上父類的大小。//其中有一部分是虛函式表的原因,一定要知道
父類子類共享乙個虛函式指標
(五)#include
class a {};
class b{};
class c:public a;
class d:public b,public c{};
int main()
程式執行的輸出結果為:
sizeof(a) =1
sizeof(b)=1
sizeof(c)=4
sizeof(d)=8
前三種情況比較常見,注意第四種情況。類d的大小更讓初學者疑惑吧,類d是由類b,c派生邇來的,它的大小應該為二者之和5,為什麼卻是8 呢?這是因為為了提高例項在記憶體中的訪問效率.類的大小往往被調整到系統的整數倍.並採取就近的法則,裡哪個最近的倍數,就是該類的大小,所以類d的大小為8個位元組.
總結:空的類是會占用記憶體空間的,而且大小是1,原因是c++要求每個例項在記憶體中都有獨一無二的位址。
(一)類內部的成員變數:
(二)類內部的成員函式:
類的占用記憶體大小
1.類的大小為類的非靜態成員資料的型別大小之和,也 就是說靜態成員資料不作考慮。2.普通成員函式與sizeof無關。3.靜態成員並不屬於某個物件,sizeof取的是物件大小。4.虛函式由於要維護在虛函式表,所以要佔據乙個指標大小,也就是4位元組。5.空類的sizeof為1。因為乙個空類也要例項化,所...
記憶體(二) 類的例項化占用
轉 初學者在學習物件導向的程式語言時,或多或少的都些疑問,我們寫的 與最終生編譯成的 卻 大相徑庭,我們並不知道編譯器在後台做了什麼工作 這些都是由於我們僅停留在語言層的原因,所謂語言層就是教會我們一些基本 的語法法則,但不會告訴我們為什麼這麼做?今天和大家談的一點感悟就是我在 學習程式設計過程中的...
c 類占用記憶體大小計算
c 類所佔記憶體大小計算 說明 筆者的作業系統是32位的。class a sizeof a sizeof a 1 明明是空類,為什麼編譯器說它是1呢?空類同樣可以例項化,每個例項在記憶體中都有乙個獨一無二的位址,為了達到這個目的,編譯器往往會給乙個空類隱含的加乙個位元組,這樣空類在例項化後在記憶體得...