程序師世界是廣大編程愛好者互助、分享、學習的平台,程序師世界有你更精彩!
首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫知識
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
 程式師世界 >> 編程語言 >> C語言 >> C >> C語言基礎知識 >> 深入分析C++中類的大小

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

編輯:C語言基礎知識

首先看一個例子:
代碼如下:

#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

  1. 上一頁:
  2. 下一頁:
Copyright © 程式師世界 All Rights Reserved