類和物件佔多少空儲空間?

2021-08-18 08:13:09 字數 1520 閱讀 3274

類或者物件的大小可以用sizeof

運算子算出,即

sizeof(object_name)

。可是sizeof(object_name)

的值與其成員的大小是什麼關係呢,答案是:乙個物件的大小

>=

所有非靜態成員大小的總和。

為什麼是大於等於而不是正好相等呢?超出的部分主要有以下兩方面: 

1) c++物件模型本身 

對有虛函式的類來說,必須為它的物件提供執行時型別資訊(rtti

,run-time type information)

和關於虛函式表的資訊,常見的做法是在物件中放置乙個指向虛函式表的指標,此外,為了支援

rtti

,許多編譯器都把該型別資訊放在虛函式表中。但是,是否必須採用這種實現方法,

c++標準沒有規定,主流編譯器均採用的一種方案。 

2) 位元組對齊

因為對於大多數cpu

來說,cpu

字長的整數倍操作起來更快,因此對於這些成員加起來如果不夠這個整數倍,有可能編譯器會插入多餘的內容湊足這個整數倍,此外,有時候相鄰的成員之間也有可能因為這個目的被插入空白,這個叫做「補齊

」(padding)

。所以,

c++標準緊緊規定成員的排列按照類定義的順序,但是不要求在儲存器中是緊密排列的。 

基於上述兩點,可以說用sizeof

對類名操作,得到的結果是該類的物件在儲存器中所佔據的位元組大小,由於靜態成員變數不在物件中儲存,因此這個結果等於各非靜態資料成員(不包括成員函式)的總和加上編譯器額外增加的位元組。後者依賴於不同的編譯器實現,

c++標準對此不做任何保證。 

c++標準規定類的大小不為

0,空類的大小為

1,當類不包含虛函式和非靜態資料成員時,其物件大小也為1。

如果在類中宣告了虛函式(不管是1

個還是多個),那麼例項化物件時,編譯器會自動在物件裡放置乙個指標指向虛函式表

vtable

,它是實現多型的關鍵點。但虛函式本身和其他成員函式一樣,是不占用物件的空間的。

我們來看下面乙個例子:

[cpp]view plain

copy

#include 

using

namespace

std;  

class

a     

;     

class

b     

};  

class

c     

};  

class

d     

};     

intmain()     

綜上所述:

虛函式、成員函式[

包括靜態與非靜態

]、和靜態資料成員都是不占用物件的儲存空間的

物件大小  =  vptr(

可能不止乙個

)   +   

所有非靜態資料成員大小   

+   

因對齊而多佔的位元組

正確判斷空物件和空陣列的方法

此方法是jquery將2方法 for in 進行封裝,使用時需要依賴jquery var data var b isemptyobject data console.log b true 此方法是使用object物件的getownpropertynames方法,獲取到物件中的屬性名,存到乙個陣列中,...

題目 空結構體和空類的大小

1 2 3 4 5 6 7 8 9 10 11 include typedefempty a intmain 以上 如果採用gcc編譯結果是0 採用g 結果是1 vs2008下如果檔名字尾為.c出現編譯錯誤 c 要求乙個結構或聯合至少有乙個成員 檔名字尾為.cpp能通過編譯輸出結果是1.ps 這裡發...

C 之 空類和空結構體的大小

linux localhost.localdomain 2.6.32 642.11.1.el6.i686 1 smp fri nov 18 18 48 28 utc 2016 i686 i686 i386 gnu linux includeusing namespace std struct aaa...