从本篇博客开始,根据《深入C++对象模型》这本书,加上自己的理解,探讨C++的对象模型以及相关的问题。博客尽量使用书中的名词、图例和例程。

一、什么是对象模型

  1. 语言中直接支持面向对象程序设计的部分
  2. 对于各种支持的底层实现机制

C与C++的区别,C语言中是将“数据”和“处理数据的操作(函数)”分离开来的,语言本身没有支持“数据和函数”之间的关联性,但是在C++中,却提供了一种ADT(abstract data type),它将“数据”和“ 处理数据的操作(函数)”结合起来,加入了class关键字。

考虑C++加上封装之后是否会产生布局成本,答案是:否!实际上,在C++中class就像C的struct的情况一样,member functions虽然含在class声明之内,却不出现在object之中,每一个non_inline member function只会诞生一个函数实体。至于每一个“拥有零个或一个定义”的inline function则会在其每一个使用者身上产生一个函数实体。这一个并未带给它任何空间或执行期的不良回应。C++在布局以及存取时间上主要的额外负担是由virtual引起,包括:virtual function机制vitrtual base class

二、C++的三种对象模型

C++是面向对象的语言,类是C++与C的区别。在C++中,有两种class data members:static和nonstatic,以及三种class member function:static、nonstatic和virtual。已知有下面这个class Point声明:

class Point
{
public:Point(float x);virtual ~Point();float x() const;static int PointCount();protected:virtual ostream& print(ostream& os) const;float _x;static int _point_count;
};

这个类的对象模型是怎样的?

在C++的构思和草案阶段,从C++的编译器实现和其他方面考虑,曾经出现过几个对象模型,这些模型逐步的完善和改进,形成了现在我们看到的C++对象模型。

1、简单对象模型

第一个模型十分简单,也许是为了减少C++编译器的设计复杂度,代价是空间和效率的损失。在这模型中,一个object(对象)是一系列的slots(注:不知如何翻译合适),每一个slot对应一个member(data or function)。按照member的声明顺序,各被指定一个slot。如下图:

在简单对象模型中,members本身不放在object中,只有“指向member的指针”才放在object中。这么做可以避免“member有不同的类型,因而需要不同的存储空间”所带来的问题。object中的member是以slot的索引值来寻址。例如,_x的索引为6,_x的地址=pt地址+6*指针大小。并且,一个object的大小可以很容易的计算出来“指针大小乘以member的个数”。

这个模型未被应用于实际的产品,但是关于索引和slot的个数概念,倒是被应用到C++的“指向成员的指针”观念之中。

2、表格驱动模型

为了对所有的classed的所有objects都有一致的表达方式,另一种对象模型是把所有与members相关的信息抽出来,放在一个data member table和一个members function table之中。class object本身则内含指向这两个表格的指针,Member function table是一系列slot,每一个slot指出一个member function;Data member table则直接持有data本身。如下图:

虽然这个模型未应用于实际产品,但member function table这个观念却成为了支持virtual function的一个有效方案。

3、C++对象模型

C++对象模式是从简单对象模型派生而来的,并对内存空间和存取时间做了优化。在此模型中,

  • Nonstatic data members被配置于每一个class object之内,
  • static data member则被存放在个别的class object之外(单独的一块区域:静态区)
  • static 和 nonstatic function也被放在个别的class object之外
  • virtual function 则以两个步骤支持之:
    1. 每一个class 产生出一堆指向virtual function的指针,放在表格之中。这个表格称之为virtual table(vtbl
    2. 每一个class object 被安插一个指针,指向相关的virtual table,通常这个指针称之为vptr,vptr的设定和重置都由每一个class的constructor、destruction和copy assignment运算符自动完成。每一个class所关联的type_info object(用以支持运行时类型确定,RTTI)也经由virtual table指出,通常放在表格第一个slot。

这个模型的主要优点是它的空间和存取效率。缺点是如果应用程序本身代码未改变,但所用到的class object的nonstatic data member有所改变(增加、删除、或更改),那么应用程序的代码同样需要重新编译。而前面所提到的表格驱动模型就有较大的弹性,因为它多了一个间接层。

总结:

  1. C与C++的区别,是ADT。
  2. 三种对象模型,C++使用了第三种,是在空间和效率上找一个平衡点。

深入C++对象模型(1) -- C++的三种模型相关推荐

  1. 产品路线图的三种模型(RICE/MoSCoW/Kano),教你如何对需求进行优先级排序

    前言 RICE/MoSCoW/Kano三种模型,教你如何对需求进行优先级排序. 也许你会让业务提供一份ROI,记得前不久参加过一场立项会评审,一位很有意思的小产品在会上讲不清楚ROI,评审们要求会后重 ...

  2. 第三天2017/03/30(上午:二级指针的(输入)内存模型:(共三种模型))

    二级指针 char a[10][10]; char (*a)[10]; char *a[10]; char **a; char **a; char **a; 字符数组的操作易犯错误: 1.字符数组在使 ...

  3. word2vec模型评估_NLP之文本分类:「Tf-Idf、Word2Vec和BERT」三种模型比较

    字幕组双语原文:NLP之文本分类:「Tf-Idf.Word2Vec和BERT」三种模型比较 英语原文:Text Classification with NLP: Tf-Idf vs Word2Vec ...

  4. Javascript事件模型系列(一)事件及事件的三种模型

    一.开篇 在学习javascript之初,就在网上看过不少介绍javascript事件的文章,毕竟是js基础中的基础,文章零零散散有不少,但遗憾的是没有看到比较全面的系列文章.犹记得去年这个时候,参加 ...

  5. 运用自回归滑动平均模型、灰色预测模型、BP神经网络三种模型分别预测全球平均气温,并进行预测精度对比(附代码、数据)

    大家好,我是带我去滑雪,每天教你一个小技巧!全球变暖是近十年来,人们关注度最高的话题.2022年夏天,蔓延全球40℃以上的极端天气不断刷新人们对于高温的认知,人们再也不会像从前那样认为全球变暖离我们遥 ...

  6. (03)_k8s之flannel三种模型安装部署详解

    flannel三种模型安装部署详解 yht_1990关注[2020-10-04 12:13:47](javascript:

  7. UML建模(三种模型)

    文章目录 一.UML建模(三种模型) 1.类模型 2.状态模型 3.交互模型 二.uml建模的步骤 一.UML建模(三种模型) 1.类模型 描述系统内部对象及其关系的静态结构.类模型由类图构建,类图中 ...

  8. bert模型可以做文本主题识别吗_NLP之文本分类:「Tf-Idf、Word2Vec和BERT」三种模型比较...

    字幕组双语原文:NLP之文本分类:「Tf-Idf.Word2Vec和BERT」三种模型比较 英语原文:Text Classification with NLP: Tf-Idf vs Word2Vec ...

  9. 机器学习番外篇—朴素贝叶斯三种模型(多项式,高斯,伯努利)

    朴素贝叶斯三种模型(多项式,高斯,伯努利) 高斯 有些特征可能是连续型变量,比如说人的身高,物体的长度,这些特征可以转换成离散型的值,比如如果身高在160cm以下,特征值为1:在160cm和170cm ...

  10. Java 三种模型,四种策略

    Java 三种模型,四种策略 (转) 混淆事务模型与事务策略是一个常见的错误.本系列关于 事务策略 的第二篇文章将概述 Java™ 平台支持的三种事务模型,并介绍使用这些模型的四种主要事务策略.通过使 ...

最新文章

  1. 面试官:BigDecimal一定不会丢失精度吗?
  2. 格式化的盘要怎么寻回文件
  3. python 条形图-可视化库-Matplotlib-条形图(第四天)
  4. shell 读取文件
  5. dedecms系统环境需求及注意事项是什么
  6. 一个现金流量表的代码
  7. Mapper动态代理开发所要遵循的四个原则
  8. python输入多个坐标点_判断多个坐标是否在同一条直线上|Python练习系列[13]
  9. parcel react_如何使用Parcel设置React应用
  10. JimuReport积木报表 — API数据源报表制作
  11. 给控件做数字签名之三:进行数字签名
  12. Number()函数转换‘单个数值的数组‘为何是数字?【JavaScript】
  13. 第四章:变量、作用域和内存问题
  14. 没有钱的苦恼与无奈:七个城市的1000元生活(转载)
  15. 数列收敛,极限值唯一
  16. 基于布谷鸟灰狼算法、灰狼算法求解复杂地形下三维无人机路径规划问题研究附matlab代码
  17. STM8L051低功耗实现
  18. Typecho Fancybox 给文章图片添加灯箱效果
  19. 华为展望5G未来 安全问题成关键
  20. Windows/Windows Server 控制面板(Control Panel) 打开方式 通用

热门文章

  1. 哔哩哔哩websocket协议逆向--制作一个属于自己的弹幕姬
  2. iPhone14到手先做啥,捷客特教你避雷手机配件“坑”
  3. 从月薪3000到年薪40w+的第二步-准备
  4. 语义分析的一些方法(三)
  5. 2022-2028全球与中国Oracle Bronto咨询服务市场现状及未来发展趋势
  6. Cannot connect to database (possibly bad driver/URL combination)
  7. 电商干货!1000万烧出来的高点击率钻展创意图十大原则(营销人性)
  8. 数据中聚类个数的确定(Determining the number of clusters in a data set)
  9. 肌电信号的包络matlab程序_基于matlab的肌电信号处理程序:
  10. linux运行fuzzbunch,方程式0day ETERNALBLUE复现之Empire ampamp; Msfconsole下的she...