关于内存布局的作业

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

下面给出具体的说明
首先我们先来看一下这两种类的具体内存模型

关于内存布局的作业_第1张图片
内存布局.png

首先,根据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 
//#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;
}

你可能感兴趣的:(关于内存布局的作业)