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平台下的话,Fruit的size应为32,Apple的size为40
下面给出具体的说明
首先我们先来看一下这两种类的具体内存模型
首先,根据Fruit的类图我们可以发现,该类的占用空间由两部分组成,1部分是数据成员,一部分是虚表。
在vs下,虚表指针的大小为4,gcc下似乎是8,这个记得不是很清楚了,但是这个完全可以写一个example虚基类来获取它的大小来判断
接下来算一下数据成员的大小4(int)+double(8)+char(1)= 13,13+4(虚表指针)= 21 跟我们的真实结果相差甚远,其实这是因为c++类中的内存布局自动对齐
在默认的情况下,c++类中以其最大数据成员的大小为对齐量进行对齐,在这里double是最大,为8
所以真实的布局是这样的:
int 4 double只能从8的整数偏移量处存放,所以int扩展至 8
double 8
char 1 扩展至8
虚表指针 4 由于整体大小需要时8的倍数,扩展到8
总共 32字节
同理,对于Apple类,我们有
Fruit类 32
size 4
key 1 由于整体大小是8的倍数,扩展到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;
}