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

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

深入分析C++中類的大小

2020-01-26 16:18:33
字體:
來源:轉載
供稿:網友

首先看一個例子:

復制代碼 代碼如下:

#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;
 }

運行結果為:

sizeof(A)=1

sizeof(B)=8

sizeof(C)=4

sizeof(D)=16


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

 

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

下面討論含有虛函數的類的大小:

復制代碼 代碼如下:

#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;
 }

運行結果為:

sizeof(A)=4

sizeof(B)=4

sizeof(C)=8

sizeof(D)=12

對于class A,它含有一個虛函數,編譯器會為虛函數生成一張虛函數表,來記錄對應的函數地址,為此,在class A的內存地址中要有一個vfptr_A指針指向這個虛表,所以class A的大小為指針大小,即4.(注意,無論類中有多少個虛函數,它們的大小都是4,因為內存中只需要保存這個指針即可)。

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

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

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

發表評論 共有條評論
用戶名: 密碼:
驗證碼: 匿名發表
主站蜘蛛池模板: 盐池县| 锦州市| 天门市| 仁怀市| 阳朔县| 旬邑县| 东乡| 边坝县| 威远县| 孟州市| 嘉禾县| 清原| 崇礼县| 建德市| 乌兰浩特市| 渝中区| 方正县| 镇赉县| 小金县| 盘山县| 台北县| 连云港市| 习水县| 闽侯县| 清新县| 富宁县| 钟山县| 太仓市| 新营市| 临澧县| 开化县| 子长县| 南开区| 平乐县| 历史| 房产| 天津市| 大洼县| 河源市| 金寨县| 聂荣县|