類或者物件的大小可以用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...