最新要闻

广告

手机

iphone11大小尺寸是多少?苹果iPhone11和iPhone13的区别是什么?

iphone11大小尺寸是多少?苹果iPhone11和iPhone13的区别是什么?

警方通报辅警执法直播中被撞飞:犯罪嫌疑人已投案

警方通报辅警执法直播中被撞飞:犯罪嫌疑人已投案

家电

当前关注:《深入探索C++对象模型》- 第一章 - 关于对象 - 笔记

来源:博客园


(相关资料图)

额外负担:主要由virtual引起

1.1 C++对象模式

简单对象模型(A Simple Object Model)

  • Object
    • ptr1 -> Data 1
    • ptr2 -> Function 1
    • ptr3 -> Function 2
    • ptr4 -> Data 2
    • ……

表格驱动对象模型(A Table-driven Object Model)

  • Object
    • Data member table ptr
    • Member function table ptr
  • Data member table
    • Data 1
    • Data 2
    • ……
  • Function member table
    • ptr -> Function 1
    • ptr -> Function 2
    • ……

C++对象模型

  • Class
    • vtbl(virtual table)
      • vfunc 1
      • v****func 2
      • ……
    • Static Data
      • Static Data 1
      • Static Data 2
      • ……
  • object
    • vptr(virtual pointer) -> vtbl
    • Nonstatic Data
      • Nonstatic Data 1
      • Nonstatic Data 2
      • ……

优缺点

优点:空间和存取时间的效率

缺点修改数据成员不能和代码分开,导致全部重新编译

加上继承

理论

  • 法一直接在对象里面添加若干指向各个基类指针
  • 法二bptr,对象添加一个基类指针,指向基类表,基类表含其所继承的基类/两种方法都是链式查找基类的,比如A->B->C,则C要先找B,再从B找到A

/也可以把所有父类父类的父类保存指针到子类对象,缩短时间,空间占用增大

实际

  • 初期:父类非静态数据成员直接放到子类对象
  • C++ 2.0起
    • 原始模型:法一
    • 演化模型:法二或者把btbl(基类表)塞到vtbl

1.2 关键词所带来的差异

关键词的困扰

  • classstruct混用
  • 混用导致“不一致性”,不符合语法规范

策略性正确的struct

  • C技巧部分依赖内存布局,在Cpp可能不适用
  • 组合而非继承,才是把C和C++结合的唯一方法

1.3 对象的差异

编程范式

  • 面向过程
  • 泛型
  • 面型对象混用编程范式易错

支持多态机制

  • 隐式类型转化
    • 如向上类型转换
  • 虚函数(virtual function)
  • 动态类型转换符(dynamic_cast)类型运算符(typeid)

对象内存占用

  • 非静态数据成员总和大小
  • 对齐
  • 虚机制额外开销

指针的类型

影响编译器的解释

cast是种编译器指令

影响覆盖范围

T类指针表明其指向空间大小对应T对象大小

加上多态

  • B从A继承,则向上类型转换
    • 相同指向地址
    • 不同覆盖范围
  • 指针类型决定
    • 可用接口
    • 接口的访问权限
  • 多态只改变解释方式
    • 所以指针引用可以,因为只是改变对内存的解读
    • 实例不行,因为修改内存

OO(Object-oriented)和OB(Object-based)

  • 面向对象基于对象
  • 差别:有无虚机制
  • OB
    • 速度更快,空间更紧凑
    • 比较没弹性

关键词: