国产探花免费观看_亚洲丰满少妇自慰呻吟_97日韩有码在线_资源在线日韩欧美_一区二区精品毛片,辰东完美世界有声小说,欢乐颂第一季,yy玄幻小说排行榜完本

首頁(yè) > 編程 > C++ > 正文

C++空類及沒(méi)有成員變量的類的大小實(shí)例分析

2020-01-26 15:29:11
字體:
來(lái)源:轉(zhuǎn)載
供稿:網(wǎng)友

眾所周知的C++中空類的大小為1,但是除了空類之外的其他一些沒(méi)有成員變量的類的大小,還是有相當(dāng)一部分開(kāi)發(fā)人員對(duì)此有很多不明之處的。

這里我們以如下代碼為例:

#includeusing namespace std;class a {};class b{};class c :public a{virtual void fun() = 0;};class d :public b, public c{};int main(){cout << "sizeof(a)" << sizeof(a) << endl;cout << "sizeof(b)" << sizeof(b) << endl;cout << "sizeof(c)" << sizeof(c) << endl;cout << "sizeof(d)" << sizeof(d) << endl;getchar();return 0;}

程序執(zhí)行的輸出結(jié)果為:

sizeof(a)=1sizeof(b)=1sizeof(c)=4sizeof(d)=8

為什么會(huì)出現(xiàn)這種結(jié)果呢?初學(xué)者肯定會(huì)對(duì)此疑惑不解,類a,b明明是空類,它的大小應(yīng)該為為0,為什么編譯器輸出的結(jié)果為1呢?這就是我們剛才所說(shuō)的實(shí)例化的原因(空類同樣可以被實(shí)例化),每個(gè)實(shí)例在內(nèi)存中都有一個(gè)獨(dú)一無(wú)二的地址,為了達(dá)到這個(gè)目的,編譯器往往會(huì)給一個(gè)空類隱含的加一個(gè)字節(jié),這樣空類在實(shí)例化后在內(nèi)存得到了獨(dú)一無(wú)二的地址,所以a,b的大小為1。

而類c是由類a派生而來(lái),它里面有一個(gè)純虛函數(shù),由于有虛函數(shù)的原因,有一個(gè)指向虛函數(shù)表的指針(vptr,有多個(gè)虛函數(shù)仍然是只有一個(gè)指針),在32位的系統(tǒng)分配給指針的大小為4個(gè)字節(jié),所以最后得到c類的大小為4

類d的大小更是會(huì)讓很多的初學(xué)者疑惑,類d是由類b,c派生而來(lái)的,它的大小應(yīng)該為二者之和5,為什么卻是8呢?這是因?yàn)闉榱颂岣邔?shí)例在內(nèi)存中的存取效率,內(nèi)存中會(huì)有數(shù)據(jù)對(duì)齊,于是類的大小往往被調(diào)整到4字節(jié)的整數(shù)倍。并采取就近的法則,往大的方向取最近的倍數(shù),就是該類的大小,所以類d的大小為8個(gè)字節(jié)(假如d由3個(gè)空類和c派生而來(lái),仍然是8)。

發(fā)表評(píng)論 共有條評(píng)論
用戶名: 密碼:
驗(yàn)證碼: 匿名發(fā)表
主站蜘蛛池模板: 祁东县| 永修县| 德保县| 陈巴尔虎旗| 永川市| 辽阳市| 吉林市| 万全县| 日喀则市| 梅州市| 包头市| 政和县| 青州市| 肃南| 章丘市| 泗水县| 通道| 顺义区| 洛浦县| 蕉岭县| 临夏县| 宜昌市| 朝阳市| 荥经县| 逊克县| 凉山| 鹿泉市| 柳江县| 内丘县| 延津县| 白玉县| 永川市| 偃师市| 乐陵市| 龙山县| 抚顺市| 奉节县| 嵩明县| 昂仁县| 台湾省| 普陀区|