深入分析C++中類的大小
首先看一個(gè)例子:
#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ì)于類A來(lái)說(shuō),雖然A是一個(gè)空類,但為了便于空類進(jìn)行實(shí)例化,編譯器往往會(huì)給它分配一個(gè)字節(jié),這樣A實(shí)例化后便在內(nèi)存中有了一個(gè)獨(dú)一無(wú)二的地址.對(duì)于類B,B的大小應(yīng)為sizeof(int)+sizeof(char)=5,但是考慮內(nèi)存對(duì)齊,B的大小應(yīng)為8.對(duì)于類C,類的靜態(tài)成員變量被放在全局區(qū),和類的普通成員并沒(méi)有放在一塊。類的靜態(tài)成員被聲明后就已存在,而非靜態(tài)成員只有類被實(shí)例化后才存在。所以C的大小為sizeof(int)=4。D的大小為B+C的大小+自身數(shù)據(jù)成員的大小,一共為16.
==========================分割線在這里====================================
下面討論含有虛函數(shù)的類的大小:
#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ú)論類中有多少個(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è)指向父類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è)指向父類A的指針,同時(shí),class D中有虛函數(shù),所以要有一個(gè)指向虛表的指針,所以sizeof(D)=sizeof(A)+4+4=12
相關(guān)文章
C語(yǔ)言實(shí)現(xiàn)登錄注冊(cè)和忘記密碼功能
這篇文章主要為大家詳細(xì)介紹了C語(yǔ)言實(shí)現(xiàn)登錄、注冊(cè)和忘記密碼功能,文中示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下2020-12-12C++ Boost MetaStateMachine定義狀態(tài)機(jī)超詳細(xì)講解
Boost是為C++語(yǔ)言標(biāo)準(zhǔn)庫(kù)提供擴(kuò)展的一些C++程序庫(kù)的總稱。Boost庫(kù)是一個(gè)可移植、提供源代碼的C++庫(kù),作為標(biāo)準(zhǔn)庫(kù)的后備,是C++標(biāo)準(zhǔn)化進(jìn)程的開發(fā)引擎之一,是為C++語(yǔ)言標(biāo)準(zhǔn)庫(kù)提供擴(kuò)展的一些C++程序庫(kù)的總稱2022-12-12C語(yǔ)言簡(jiǎn)單實(shí)現(xiàn)銀行ATM存取款功能
這個(gè)是大一時(shí)期寫的。大四的時(shí)候整理了一下(本人C語(yǔ)言學(xué)的也不太好)??隙ê芏嗖蛔愫痛嬖诼┒吹牡胤健H供借鑒、僅供借鑒,代碼中有大量注釋,新手看起來(lái)也沒(méi)有困難2021-11-11C/C++實(shí)現(xiàn)crc碼計(jì)算和校驗(yàn)
循環(huán)冗余校驗(yàn)(Cyclic Redundancy Check, CRC)是一種根據(jù)網(wǎng)絡(luò)數(shù)據(jù)包或計(jì)算機(jī)文件等數(shù)據(jù)產(chǎn)生簡(jiǎn)短固定位數(shù)校驗(yàn)碼的一種信道編碼技術(shù)。本文主要介紹了C++實(shí)現(xiàn)crc碼計(jì)算和校驗(yàn)的方法,需要的可以參考一下2023-03-03