题目描述:1. 分别给出下面的类型Fruit和Apple的类型大小(即对象size),并通过画出二者对象模型图以及你的测试来解释该size的构成原因。
class Fruit{test 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(){ }};
当类里面存在虚函数时,这个类所占的内存就会比没有虚函数时候大一点,大的位置是在类的成员变量前面会多出一个指针(vptr),它指向虚指针表(vtbl),虚指针表里面的每一个指针再指向对应的虚函数。从而实现动态绑定。
在数据存储时,由于内存是按照最小块分配的,且根据c++标准,成员的内存顺序与代码的定义顺序相同,且在初始化子类的对象时,会先初始化父类的对象,再初始化子类的对象。测试代码如下:#includeusing namespace std;class Fruit{public: int no=10; double weight; char key;public: void print(){} virtual void process(){}};class Apple: public Fruit{public: int size; char type;public: void save(){} virtual void process(){}};int main(){ cout<<"Fruit大小="< <
使用cb编译器mingw32-gcc-4.7.1的运行结果如下:
二者的对象模型图如下
由于是32位版本,因此根据运行结果int类型大小为4,double为8,char大小为1.又由于内存对齐原则。其内存模型应如下图所示:
虚函数表指针大小与int类型相同为4,32位最小分配内存为8,不足8会补足,因此Fruit大小等于4+4+8+4=20补足8的倍数为24.Apple大小等于4+4+8+4+4+4=28补足8倍数为32.使用vs MSBuild运行结果如下:
内存图如下:
vs为64位,所以指针为8字节因此这种情况下
Fruit大小为 8+8+8+8=32Apple大小为 8+8+8+8+8=40