C++ 对象模型

C++ 对象模型
虚函数机制, 实现执行器绑定
虚基类机制, 实现多继承体系中只有一个共享实体;
非静态数据成员放在 object 之中
静态数据成员放在 object 之外
静态和非静态成员函数都放在 object 之外
每个类会产生一堆指向虚函数的指针, 放在一个表格( vbtl) 中, vbtl 的第一个 slots 放置
type_info( 用以支持 RTTI) 信息
每个 object 产生一个指针( vptr) 指向这个虚表, vptr 的设定和重置由, 构造、 析构、 拷贝
复制函数完成,
虚拟多继承, 虚基类表, 每个对象都有一个指向虚基类共享数据的指针
默认构造器自动生成条件
带有 默认构造器的 成员类 object
带有 默认构造器的 基类
带有 虚函数的 类
带有 虚基类的 类
以上 4 中情况会编译器会产生一个 暗中不可以忽略的默认构造器, 这个构造器仅供编译器
使用;
( 浅拷贝) bitwise
( 深拷贝) memberwise
NRV 就是当返回一个 class object 的函数, 编译器转换为多传递一个引用参数方式, 就可以
减少一次拷贝构造的调用;
必须使用初始化列表的情况
初始化引用
初始化 const 成员
调用基类构造器。 而它有一组参数
调用一个成员类的构造器, 而它拥有一组参数
初始化列表初始化顺序是按照声明的顺序初始化的, 而不是初始化列表的顺序初始化
C++ 对象模型会把数据存放在每一个 class objec 之中, 对于继承而来的数据成员也是如此;
class object 的大小还可能会受到 virtual 机制的影响和内存对齐的影响;
非静态成员在 class obje 中的排列顺序和声明的顺序一样
单一继承内存布局
多重继承内存布局
所有编译器的做法是把 vptr 放在队象的头部, 就是放在对象的尾部;
C++语言要求同一个访问等级的 data 成员排列次序必须和声明的次序一致;
普通成员函数
对普通成员函数添加一个 this, 然后重新封装一个函数
单继承关系虚函数表内存布局:
带有虚函数的多继承扩展类内存布局
建议不要再虚基类中声明 nostatic 成员变量
普通成员函数指针, 在没有虚函数, 多继承, 虚拟继承的情况下, 使用成本不会增加;
thunk 是比较有效率的一种, thunk 将虚表中本来存放虚函数地址改为存放指向一小段代码
的指针, 这一段代码用来调整 this 的值, 这种技术就被称为 thunk。
默认拷贝函数不会出现浅拷贝语义的情况
 含有成员对象, 该对象的类提供了拷贝赋值函数
 继承自一个基类, 基类定义了拷贝赋值函数
 当一个类含有虚函数时
 一个类虚拟继承自一个类;
delete p;只会释放其指向的内存, 不会把指针清零( =nullptr)
对象的构造是先申请内存, 然乎调用构造函数, 对象的析构则是先调用析构函数, 在释放内
存;
一个对象的大小
1、 非静态成员的大小
2、 内存对齐所需要的大小
3、 指出 virtual 多态所需要的大小
指针的类型会告知编译器某个特定地址的中内存的内容和大小
 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

Car12

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值