Inside C++ object Model--对象模型概述

在C中, "数据"和"处理数据的操作"是分开声明的, 语言本身并没有支持"数据和函数"之间的关联性. 这种称为"procedural", 由一组算法函数所驱动, 他们处理的是共同的外部数据.

而C++, 则在程序风格, 更在程序的思考上有明显的差异, 它以ADT或class hierarchy的数据封装建立数据和操作的关联性. 在软件工程的眼光来看更为合理.

但是程序员往往出于效率和简易性考虑而选择C.

 

那么使用C++是否就一定意味着低效了...

其实C++在布局以及存储时间上的额外负担主要是由"virtual"引起的,

  • the virtual function mechanism in its support of an efficient run-time binding, and

  • a virtual base class in its support of a single, shared instance of a base class occurring multiple times within an inheritance hierarchy.

一般而言, 并没有什么天生的理由说C++一定比C庞大或迟缓.

 

对象模型

作为此书讨论的基础, 首先要来分析一下C++的对象模型. 所谓对象模型, 就是在内存中怎么样来存储一个对象.

对于对象的存储, 下面有3种模型

简单对象模型

这个模型, 顾名思义, 就是为了尽量减低C++编译器的设计复杂度而开发的, 当然简单带来的是空间和执行期的低效.

这个模型中, 对象就是一系列slots, slot中存放了指向members的指针, members按程序中的声明顺序排列.

对象中并不实际存放members, 只是存放member的指针, 这样的好处是member的类型不会影响对象的存储空间.

但是降低了访问效率,  和存储效率, 由于需要通过指针间接访问, 并要额外存储指针.

 

表格驱动对象模型

这个模型, 相对于简单模型, 更加抽象, 它会把data member和function member分别放在两个table中,

The member function table 和简单模型一样存放的是函数指针. The data member table 直接存放的是data本身.

而对象本身只存放这两个table的指针, 这样最大的好处是, 对象大小是固定的, 无论members怎样改变.

表格驱动对象模型

 

C++对象模型

C++模型从简单对象模型派生而来, 并对内存空间和存取时间做了优化. 各个member的存储方法如下,

Nonstatic data members are allocated directly within each class object.

Static data members are stored outside the individual class object.

Static and nonstatic function members are also hoisted outside the class object.

Virtual functions are supported in two steps:

  1. A table of pointers to virtual functions is generated for each class (this is called the virtual table ).

  2. A single pointer to the associated virtual table is inserted within each class object (traditionally, this has been called the vptr ).The type_info object associated with each class in support of runtime type identification (RTTI) is also addressed within the virtual table, usually within the table's first slot.

如下图所示, 对于C++对象模型, 对象内只会保存Nonstatic data members和vptr, 这个模型的优点是在于空间和存取时间的效率, 缺点是由于考虑存取效率把Nonstatic data members直接存放在对象中, 导致任何数据成员的改动都会影响类对象的大小. 此处表格驱动对象模型就提供了较大的弹性, 不过鱼和熊掌不能兼得. 在设计时, 就需要根据实际需要进行取舍, C++更看重效率, 而CORBA这样的组件平台, 就会选择耦合度更低的表格驱动模型, 以利于当类成员改变后, 可以不需重新编译客户代码(因为对于这种模型, 对象大小是不变的).

C++对象模型

继承的对象模型

前面讨论了基本的C++对象模型, 如果加入了继承语言特性, 对象模型又要做什么样的改动

这个问题就是怎样在内存中存放父类, 派生类, 以及建立之间的关系.

简单的想法就是, 在对象中增加一个slot去存放父类对象指针, 有几个父类就增加几个slots

更透明的方法是, 专门生成一个base class table来存放所有父类指针, 并在对象中增加一个bptr来指向这个table.

这个方法的问题就是由于间接性导致的效率问题, 但优点就是对象对于继承的一致的表现方式, 可以任意修改父类, 而不会影响该类对象本身

 

前面说了C++更看重效率, 所以它没有采用任何的间接方法,

The data members of the base class subobject are directly stored within the derived class object.

缺点很明显,就是任意base class发生改变, 所有用到该类的派生类都需要重新编译.

关于C++对于虚基类的处理会在后面章节讨论...



转载于:https://www.cnblogs.com/fxjwind/archive/2011/07/05/2098638.html

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/263389.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

[转载]男生女生过家家呀

一时兴起百度一下高中时的语文老师,还真搜到了三篇文章。觉得这篇比较有意思,把它贴上来。以我目前的学识和人生阅历,实在没资格评论恩师的文章,不过欢迎大家发表自己的意见啊。 …

Microsoft Visual C++ Runtime Library Runtime Error的解决的方法

打开浏览器时,出现Microsoft Visual C Runtime Library Runtime Error错误,初步预计是软件冲突,可能有多种出错的方式,我的是浏览器自己主动关闭。 一、 有些时候,在你安装、执行某个软件,可能会得到这样一…

java之hibernate之基于外键的一对一单向关联映射

这篇讲解基于外键的一对一单向关联映射 1.考察如下信息,人和身份证之间是一个一对一的关系。表的设计 注意:基于外键的一对一关联的表结构和多对一的表结构是一致的,但是,外键是唯一的。 2.类的结构 Person.java public class Per…

访问被拒绝:“microsoft.web.ui.webcontrols”的解决办法

错误: 配置错误 说明: 在处理向该请求提供服务所需的配置文件时出错。请检查下面的特定错误详细信息并适当地修改配置文件。 分析器错误信息: 访问被拒绝:“microsoft.web.ui.webcontrols”。 ---&#xff0…

intellij idea 热部署 spring jvm 版

2019独角兽企业重金招聘Python工程师标准>>> 配置 intellij idea tomcat 加入下面这个参数, 对应jar 到 mvnrepo 下载 。 -javaagent:D:\work\springloaded-1.2.3.RELEASE.jar -noverify 转载于:https://my.oschina.net/u/556878/blog/416563

大数据——Hadoop学习笔记(配置)

具体代码可以参考: https://github.com/Ostrich5yw/java4BigData

面试题——20190717

redis持久化有哪些策略? 文章:redis持久化的几种方式 redis提供两种方式进行持久化,一种是RDB持久化(原理是将Reids在内存中的数据库记录定时dump到磁盘上的RDB持久化),另外一种是AOF(append on…

以C#编写的Socket服务器的Android手机聊天室Demo

内容摘要 1.程序架构 2.通信协议 3.服务器源代码 4.客户端源代码 5.运行效果 一、程序架构 在开发一个聊天室程序时,我们可以使用Socket、Remoting、WCF这些具有双向通信的协议或框架。而现在,我正要实现一个C#语言作为服务器端、Android作为客户端的聊天…

[导入]泊

又梦见战乱。 过年可能又回不了家,昨天打电话给家里,母亲哭了。 出来了才觉得我为什么活着,每天平躺的地方够大生活就已经满足了,但是需要什么来填补我空洞的灵魂?文章来源:http://dotnet.mblogger.cn/zeusvenus/posts…

LeetCode—275. H 指数 II

275. H 指数 II 题目描述: 给你一个整数数组 citations ,其中 citations[i] 表示研究者的第 i 篇论文被引用的次数,citations 已经按照 升序排列 。计算并返回该研究者的 h 指数。 h 指数的定义:h 代表“高引用次数”&#xff0…

maven环境快速搭建

2019独角兽企业重金招聘Python工程师标准>>> 最近,开发中要用到maven,所以对maven进行了简单的学习。因为有个maven高手在身边,所以,很快就上手了,我这里算是自我总结吧。关于maven是什么东东,请…

20190718考试70分记

又考试了&#xff0c;这次题明显感觉难多了&#xff0c;骗了不少分&#xff0c;竟然rk13 第一题一看不可做&#xff0c;然后看第二题 第二题一开始也没有思路&#xff0c;然后我就看上了k<1的情况&#xff0c; 显然k0时只要求所有数的gcd即可&#xff0c; k1的话枚举每一个树…

[散记]今天

前几天还下了一场不小的雪&#xff0c;冷的很。昨天出门还穿了厚毛衣和棉外套&#xff0c;起风的时候还觉得凉飕飕的。今天就热的很了&#xff0c;天气预报说最高温度有16度。出门换了薄毛衣和薄外套&#xff0c;走了一段路&#xff0c;竟是闷热的很&#xff0c;索性将外套脱掉…

随笔03

Application -- HOOKUP -- Interpreters 转载于:https://www.cnblogs.com/soulnearby/archive/2011/07/08/2100734.html

Struts2 文件上传,下载,删除

本文介绍了&#xff1a; 1.基于表单的文件上传 2.Struts 2 的文件下载 3.Struts2.文件上传 4.使用FileInputStream FileOutputStream文件流来上传 5.使用FileUtil上传 6.使用IOUtil上传 7.使用IOUtil上传 8.使用数组上传多个文件 9.使用List上传多个文件 ----1.基于表单的文件…

LeetCode—44. 通配符匹配(困难)

44. 通配符匹配&#xff08;困难&#xff09; 题目描述&#xff1a; 给定一个字符串 (s) 和一个字符模式 &#xff0c;实现一个支持 ‘?’ 和 ‘*’ 的通配符匹配。 ‘?’ 可以匹配任何单个字符。 ‘*’ 可以匹配任意字符串&#xff08;包括空字符串&#xff09;。 两个字…

怎样和客户一起搞定需求

项目刚刚开始的时期&#xff0c;项目经理做的主要事情是搜集客户需求&#xff0c;这是一个项目经理非常头疼的阶段&#xff0c;合作的磨合刚刚开始&#xff0c;需求问题上的失误又会导致无穷的后患。三种客户类型&#xff1a; 1 的确很专业。能提供基本可用的文档&#xff0c;能…

字符串后面去0、补0

去掉0 str.replaceAll("0$", "") 补0至n位 String.format("%-ns",swjgPrefix ).replace( ,0) 前面的话不要“-”号 0可以换成任意字符转载于:https://www.cnblogs.com/IceBlueBrother/p/11208433.html

疑问:C#中的委托

我这几天一直在看C#的书&#xff0c;知道了委托是怎么回事&#xff0c;但我一直不能理解这个委托是用在什么地方&#xff0c;有什么好处&#xff0c;请高手指点。 转载于:https://www.cnblogs.com/yjlft/archive/2006/04/03/365443.html