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

首頁 > 編程 > C++ > 正文

深入研究c++類的大小

2020-02-24 14:35:01
字體:
供稿:網(wǎng)友

這篇文章將帶您深入研究c++類的大小問題,學(xué)習(xí)下來,你可能會(huì)發(fā)現(xiàn)這根本就是一門新的語言,想知道其中的內(nèi)容詳情,一起往下學(xué)習(xí)吧,你會(huì)有新的收獲的。

首先看一個(gè)例子:

復(fù)制代碼 代碼如下:

#include
?using namespace std;

?class A{};

?class B
?{
???? int b;
???? char c;
?};

?class C++
?{
???? int c1;???
???? static int c2;
?};
?int C::c2 = 1;

?class D:public C,public B{
???? int d;
?};
?int main()
?{
???? cout<<"sizeof(A)="<???? cout<<"sizeof(B)="<???? cout<<"sizeof(C)="<???? cout<<"sizeof(D)="<
???? return 0;
?}
(d)
(c)
(b)
(a)


運(yùn)行結(jié)果為:

?

sizeof(A)=1

sizeof(B)=8

sizeof(C)=4

sizeof(D)=16


對于類A來說,雖然A是一個(gè)空類,但為了便于空類進(jìn)行實(shí)例化,編譯器往往會(huì)給它分配一個(gè)字節(jié),這樣A實(shí)例化后便在內(nèi)存中有了一個(gè)獨(dú)一無二的地址.對于類B,B的大小應(yīng)為sizeof(int)+sizeof(char)=5,但是考慮內(nèi)存對齊,B的大小應(yīng)為8.對于類C,類的靜態(tài)成員變量被放在全局區(qū),和類的普通成員并沒有放在一塊。類的靜態(tài)成員被聲明后就已存在,而非靜態(tài)成員只有類被實(shí)例化后才存在。所以C的大小為sizeof(int)=4。D的大小為B+C的大小+自身數(shù)據(jù)成員的大小,一共為16.

?

==========================分割線在這里====================================

下面討論含有虛函數(shù)的類的大?。?/p>

復(fù)制代碼 代碼如下:

#include
?using namespace std;

?class A
?{
?public:
???? void virtual aa(){};
?};

?class B:public A
?{
???? void virtual bb(){};
?};

?class C:virtual A
?{
?public:
???? void virtual aa(){};
???? void cc(){};
?};

?class D:virtual A
?{
?public:
???? void virtual dd(){};
?};

?int main()
?{
???? cout<<"sizeof(A)="<???? cout<<"sizeof(B)="<???? cout<<"sizeof(C)="<???? cout<<"sizeof(D)="<
???? return 0;
?}
(d)
(c)
(b)
(a)


運(yùn)行結(jié)果為:

?

sizeof(A)=4

sizeof(B)=4

sizeof(C)=8

sizeof(D)=12

對于class A,它含有一個(gè)虛函數(shù),編譯器會(huì)為虛函數(shù)生成一張?zhí)摵瘮?shù)表,來記錄對應(yīng)的函數(shù)地址,為此,在class A的內(nèi)存地址中要有一個(gè)vfptr_A指針指向這個(gè)虛表,所以class A的大小為指針大小,即4.(注意,無論類中有多少個(gè)虛函數(shù),它們的大小都是4,因?yàn)閮?nèi)存中只需要保存這個(gè)指針即可)。

對于class B,它是public繼承A,雖然它也有一個(gè)虛函數(shù),但是從結(jié)果看,B應(yīng)該和A都在B的vtable(虛表中),所以class B的大小為4.

對于class C,它是vitual 繼承A,所以要有一個(gè)指向父類A的指針,占有4字節(jié)大小aa()是繼承自class A的虛函數(shù),從結(jié)果來看,它沒有在內(nèi)存中占有空間,所以C的大小為sizeof(A)+4=8.

對于class D,它是虛繼承class A,同上,要有一個(gè)指向父類A的指針,同時(shí),class D中有虛函數(shù),所以要有一個(gè)指向虛表的指針,所以sizeof(D)=sizeof(A)+4+4=12

以上就是武林小編帶來的深入研究c++類的大小,想必都已有了一定的了解,更多關(guān)于C++的內(nèi)容請繼續(xù)關(guān)注武林技術(shù)頻道。

發(fā)表評論 共有條評論
用戶名: 密碼:
驗(yàn)證碼: 匿名發(fā)表
主站蜘蛛池模板: 乌兰浩特市| 旌德县| 拉孜县| 简阳市| 岳阳县| 丰原市| 龙里县| 友谊县| 甘泉县| 五河县| 南靖县| 梁平县| 新晃| 若羌县| 比如县| 若尔盖县| 双柏县| 佛山市| 宿迁市| 班戈县| 扎赉特旗| 香格里拉县| 江永县| 岫岩| 东辽县| 布拖县| 安西县| 呼玛县| 靖远县| 龙江县| 鞍山市| 扬州市| 太康县| 丹棱县| 台山市| 澄城县| 景宁| 呼伦贝尔市| 泗洪县| 会理县| 织金县|