最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

深入分析C++中類(lèi)的大小

 更新時(shí)間:2013年05月04日 09:20:40   作者:  
本篇文章深入分析了C++中類(lèi)的大小問(wèn)題。需要的朋友參考下

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

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

#include <iostream>
 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)="<<sizeof(A)<<endl;
     cout<<"sizeof(B)="<<sizeof(B)<<endl;
     cout<<"sizeof(C)="<<sizeof(C)<<endl;
     cout<<"sizeof(D)="<<sizeof(D)<<endl;

     return 0;
 }

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

sizeof(A)=1

sizeof(B)=8

sizeof(C)=4

sizeof(D)=16


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

 

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

下面討論含有虛函數(shù)的類(lèi)的大小:

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

#include <iostream>
 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)="<<sizeof(A)<<endl;
     cout<<"sizeof(B)="<<sizeof(B)<<endl;
     cout<<"sizeof(C)="<<sizeof(C)<<endl;
     cout<<"sizeof(D)="<<sizeof(D)<<endl;

     return 0;
 }

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

sizeof(A)=4

sizeof(B)=4

sizeof(C)=8

sizeof(D)=12

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

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

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

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

相關(guān)文章

最新評(píng)論

西藏| 汝阳县| 冷水江市| 河曲县| 大田县| 鹤壁市| 连平县| 清镇市| 宣汉县| 项城市| 柘荣县| 河间市| 吉林市| 晴隆县| 灵璧县| 库车县| 大同市| 太仆寺旗| 阜城县| 伊春市| 西宁市| 天长市| 盈江县| 根河市| 十堰市| 甘谷县| 临澧县| 青州市| 峨眉山市| 洛宁县| 米脂县| 伊宁市| 西安市| 罗城| 洛南县| 台南市| 故城县| 饶阳县| 新闻| 崇仁县| 清涧县|