class Fruit{
int no;
double weight;
char key;
public:
void print() { }
virtual void process(){ }
};
class Apple: public Fruit{
int size;
char type;
public:
void save() { }
virtual void process(){ }
};
在vs平臺下的話,F(xiàn)ruit的size應(yīng)為32,Apple的size為40
下面給出具體的說明
首先我們先來看一下這兩種類的具體內(nèi)存模型

內(nèi)存布局.png
首先,根據(jù)Fruit的類圖我們可以發(fā)現(xiàn),該類的占用空間由兩部分組成,1部分是數(shù)據(jù)成員,一部分是虛表。
在vs下,虛表指針的大小為4,gcc下似乎是8,這個記得不是很清楚了,但是這個完全可以寫一個example虛基類來獲取它的大小來判斷
接下來算一下數(shù)據(jù)成員的大小4(int)+double(8)+char(1)= 13,13+4(虛表指針)= 21 跟我們的真實結(jié)果相差甚遠(yuǎn),其實這是因為c++類中的內(nèi)存布局自動對齊
在默認(rèn)的情況下,c++類中以其最大數(shù)據(jù)成員的大小為對齊量進(jìn)行對齊,在這里double是最大,為8
所以真實的布局是這樣的:
int 4 double只能從8的整數(shù)偏移量處存放,所以int擴(kuò)展至 8
double 8
char 1 擴(kuò)展至8
虛表指針 4 由于整體大小需要時8的倍數(shù),擴(kuò)展到8
總共 32字節(jié)
同理,對于Apple類,我們有
Fruit類 32
size 4
key 1 由于整體大小是8的倍數(shù),擴(kuò)展到8
所以是40
附上測試程序:
#include <iostream>
//#pragma pack(8)
class Fruit{
// test
int no;
double weight;
char key;
public:
void print() { }
virtual void process(){ }
};
class Apple : public Fruit{
int size;
char type;
// int dd;
// int s;
public:
void save() { }
virtual void process(){ }
};
class example
{
virtual void test(){}
};
int main(void)
{
std::cout << "example " << sizeof(example) << std::endl;
std::cout << "apple " << sizeof(Apple) << std::endl;
std::cout << "fruit" << sizeof(Fruit) << std::endl;
// std::cout << "double " << sizeof(double) << std::endl;
system("pause");
return 0;
}