深入C++对象模型(1) -- C++的三种模型
从本篇博客开始,根据《深入C++对象模型》这本书,加上自己的理解,探讨C++的对象模型以及相关的问题。博客尽量使用书中的名词、图例和例程。
一、什么是对象模型
- 语言中直接支持面向对象程序设计的部分
- 对于各种支持的底层实现机制
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 则以两个步骤支持之:
- 每一个class 产生出一堆指向virtual function的指针,放在表格之中。这个表格称之为virtual table(vtbl)
- 每一个class object 被安插一个指针,指向相关的virtual table,通常这个指针称之为vptr,vptr的设定和重置都由每一个class的constructor、destruction和copy assignment运算符自动完成。每一个class所关联的type_info object(用以支持运行时类型确定,RTTI)也经由virtual table指出,通常放在表格第一个slot。
这个模型的主要优点是它的空间和存取效率。缺点是如果应用程序本身代码未改变,但所用到的class object的nonstatic data member有所改变(增加、删除、或更改),那么应用程序的代码同样需要重新编译。而前面所提到的表格驱动模型就有较大的弹性,因为它多了一个间接层。
总结:
- C与C++的区别,是ADT。
- 三种对象模型,C++使用了第三种,是在空间和效率上找一个平衡点。
深入C++对象模型(1) -- C++的三种模型相关推荐
- 产品路线图的三种模型(RICE/MoSCoW/Kano),教你如何对需求进行优先级排序
前言 RICE/MoSCoW/Kano三种模型,教你如何对需求进行优先级排序. 也许你会让业务提供一份ROI,记得前不久参加过一场立项会评审,一位很有意思的小产品在会上讲不清楚ROI,评审们要求会后重 ...
- 第三天2017/03/30(上午:二级指针的(输入)内存模型:(共三种模型))
二级指针 char a[10][10]; char (*a)[10]; char *a[10]; char **a; char **a; char **a; 字符数组的操作易犯错误: 1.字符数组在使 ...
- word2vec模型评估_NLP之文本分类:「Tf-Idf、Word2Vec和BERT」三种模型比较
字幕组双语原文:NLP之文本分类:「Tf-Idf.Word2Vec和BERT」三种模型比较 英语原文:Text Classification with NLP: Tf-Idf vs Word2Vec ...
- Javascript事件模型系列(一)事件及事件的三种模型
一.开篇 在学习javascript之初,就在网上看过不少介绍javascript事件的文章,毕竟是js基础中的基础,文章零零散散有不少,但遗憾的是没有看到比较全面的系列文章.犹记得去年这个时候,参加 ...
- 运用自回归滑动平均模型、灰色预测模型、BP神经网络三种模型分别预测全球平均气温,并进行预测精度对比(附代码、数据)
大家好,我是带我去滑雪,每天教你一个小技巧!全球变暖是近十年来,人们关注度最高的话题.2022年夏天,蔓延全球40℃以上的极端天气不断刷新人们对于高温的认知,人们再也不会像从前那样认为全球变暖离我们遥 ...
- (03)_k8s之flannel三种模型安装部署详解
flannel三种模型安装部署详解 yht_1990关注[2020-10-04 12:13:47](javascript:
- UML建模(三种模型)
文章目录 一.UML建模(三种模型) 1.类模型 2.状态模型 3.交互模型 二.uml建模的步骤 一.UML建模(三种模型) 1.类模型 描述系统内部对象及其关系的静态结构.类模型由类图构建,类图中 ...
- bert模型可以做文本主题识别吗_NLP之文本分类:「Tf-Idf、Word2Vec和BERT」三种模型比较...
字幕组双语原文:NLP之文本分类:「Tf-Idf.Word2Vec和BERT」三种模型比较 英语原文:Text Classification with NLP: Tf-Idf vs Word2Vec ...
- 机器学习番外篇—朴素贝叶斯三种模型(多项式,高斯,伯努利)
朴素贝叶斯三种模型(多项式,高斯,伯努利) 高斯 有些特征可能是连续型变量,比如说人的身高,物体的长度,这些特征可以转换成离散型的值,比如如果身高在160cm以下,特征值为1:在160cm和170cm ...
- Java 三种模型,四种策略
Java 三种模型,四种策略 (转) 混淆事务模型与事务策略是一个常见的错误.本系列关于 事务策略 的第二篇文章将概述 Java™ 平台支持的三种事务模型,并介绍使用这些模型的四种主要事务策略.通过使 ...
最新文章
- 面试官:BigDecimal一定不会丢失精度吗?
- 格式化的盘要怎么寻回文件
- python 条形图-可视化库-Matplotlib-条形图(第四天)
- shell 读取文件
- dedecms系统环境需求及注意事项是什么
- 一个现金流量表的代码
- Mapper动态代理开发所要遵循的四个原则
- python输入多个坐标点_判断多个坐标是否在同一条直线上|Python练习系列[13]
- parcel react_如何使用Parcel设置React应用
- JimuReport积木报表 — API数据源报表制作
- 给控件做数字签名之三:进行数字签名
- Number()函数转换‘单个数值的数组‘为何是数字?【JavaScript】
- 第四章:变量、作用域和内存问题
- 没有钱的苦恼与无奈:七个城市的1000元生活(转载)
- 数列收敛,极限值唯一
- 基于布谷鸟灰狼算法、灰狼算法求解复杂地形下三维无人机路径规划问题研究附matlab代码
- STM8L051低功耗实现
- Typecho Fancybox 给文章图片添加灯箱效果
- 华为展望5G未来 安全问题成关键
- Windows/Windows Server 控制面板(Control Panel) 打开方式 通用
热门文章
- 哔哩哔哩websocket协议逆向--制作一个属于自己的弹幕姬
- iPhone14到手先做啥,捷客特教你避雷手机配件“坑”
- 从月薪3000到年薪40w+的第二步-准备
- 语义分析的一些方法(三)
- 2022-2028全球与中国Oracle Bronto咨询服务市场现状及未来发展趋势
- Cannot connect to database (possibly bad driver/URL combination)
- 电商干货!1000万烧出来的高点击率钻展创意图十大原则(营销人性)
- 数据中聚类个数的确定(Determining the number of clusters in a data set)
- 肌电信号的包络matlab程序_基于matlab的肌电信号处理程序:
- linux运行fuzzbunch,方程式0day ETERNALBLUE复现之Empire ampamp; Msfconsole下的she...