深度探索C++对象模型 记录

深度探索C++对象模型 记录,第1张

1. 单个类的内存布局




1、2情况一样,3的情况不一样,
3按照编译器的具体规则进行访问控制级别的内存分配,但是一般都是按照顺序的声明进行分配

2. 继承下的内存布局(非多态)

2.1 单继承的对象布局

一个类继承另外一个类,该类的内存布局为第二种,不是第一种,原因如下:
防止将p2赋值给p1的时候,将原先不存在数据的padding给变得有数据了

  • 疑惑点:gcc9.3.0编译结果是前一种布局,按理说应该是后一种的???

2.2 多继承的对象布局

  1. 存在两个析构函数: 一个是自己定义的,一个是编译器合成的,编译器合成的析构函数调用了自己定义的析构函数;
  2. 如果一个虚函数在基类定义了,派生类没有重写,那么子类的虚表里面存的是基类的虚函数地址
  3. 对于非虚函数的继承,
    Point2D::fun()函数会传入this指针,即对象的地址,如果在Point3D里面调用Point2D::fun()会进行类型转换,强制转换成Point2D类型。
  4. 基类的虚函数需要声明成虚析构函数,否则容易发生内存泄漏
3. 构造函数

下面是两条误解,需要自己写构造函数,不能让编译器写

如果用户没有定义构造函数,编译器合成默认构造函数是没有用的

学习链接:
https://www.bilibili.com/video/BV1v64y1q7JT?p=1&vd_source=d4df260b1907b7a2424f450d404e1eba


待更新添加…

欢迎分享,转载请注明来源:内存溢出

原文地址: http://www.outofmemory.cn/langs/2991568.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
上一篇 2022-09-23
下一篇 2022-09-23

发表评论

登录后才能评论

评论列表(0条)

保存