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

來源:互聯網
上載者:User

首先看一個例子:

複製代碼 代碼如下:#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

相關文章

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.