美文网首页
关于内存布局的作业

关于内存布局的作业

作者: 七七的面包在流浪 | 来源:发表于2016-03-25 05:32 被阅读0次
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

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

内存布局.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 <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;
}

相关文章

  • 关于内存布局的作业

    在vs平台下的话,Fruit的size应为32,Apple的size为40 下面给出具体的说明首先我们先来看一下这...

  • 关于rust的内存布局

    常用类型 一般类型的布局是其大小(size)、对齐方式(align)及其字段的相对偏移量: 对于枚举,如何布局和解...

  • iOS内存布局

    内存布局图内存布局图 代码演示

  • iOS内存管理底层原理

    内存布局 了解程序内存布局请点击程序的内存布局以及栈、堆原理[https://www.jianshu.com/p/...

  • 谈谈Swift中的枚举内存布局

    谈谈Swift中的枚举内存布局谈谈Swift中的枚举内存布局

  • iOS面试 -- 内存管理

    来源:爱玩游戏的iOS菜鸟 内存布局 iOS程序下内存布局 不同内存布局区域的含义stack(栈):方法调用hea...

  • iOS 内存管理

    一.内存布局以及结构 1.1内存布局 1.2内存管理方案 内存管理方案有3种:TaggedPointer (小对象...

  • iOS 自动释放池autoreleasepool(一)

    前言 在前面几篇文章,说了关于OC中的内存布局、内存管理方案、以及MRC情况下的retainCount、retai...

  • C/C++/OC 内存布局

    这几天看了些关于内存布局的文章,发帖总结摘录下重点。 C语言的内存模型 程序代码区(code area) 存放函数...

  • 22,虚拟内存的布局

    32位内存布局 image.png 64位内存布局 image.png

网友评论

      本文标题:关于内存布局的作业

      本文链接:https://www.haomeiwen.com/subject/kynrlttx.html