引言

  以前读《C++ Primer》的时候一直有一种感觉:该书虽然是C++入门书籍,初学者读之却觉晦涩,越往后读越是如此。等到稍加理解后再读该书,顿感醍醐灌顶,茅塞顿开。究其原因,在于原作者Stanley Lippman总是会有意无意地从编译器的角度来介绍语言的细节:对新手而言,哪里会去关注这样底层的实现呢?

  当读到《Inside The C++ Object Model》时,上述感觉愈发强烈,两书之间渐进讲述的细节让人读后大呼过瘾,也深感大师级作者笔触间的睿智。

  众所周知,C++是一门支持多范式的语言(《Effective C++》Item1),其中最为重要,对C语言最大的变革便是面向对象的设计思想。而本书,依其简介,探索“对象导向程序所支持的C++对象模型”下的程序行为。对于“对象导向性质之基础实现技术”以及“各种性质背后的隐含利益交换”提供一个清楚的认识。检验由程序变形所带来的效率冲击。提供对象导向观念和底层对象模型之间的效率测量。

关于对象

  从C语言转化到C++时,一个显而易见的区别在于从全局数据过渡到数据封装,那么其布局成本(Layout Costs)如何?答案是并未增加。本文后续将讲述C++在布局以及存取时间上主要的额外负担是由virtual引起,包括:

  • virtual function 机制,用来支持有效率的“执行期绑定”。
  • virtual base class 虚基类机制,以实现共享虚基类的 subobject。

  此外还有一些多重继承的额外负担,除此,C++毫无理由比C慢。

C++对象模式

  类的成员包括类数据成员(静态和非静态)和类成员函数(静态,非静态和虚函数)。

  考虑如下简单对象模型:

  我们看到,成员本身并不在对象里,只有指向对象的指针才在,如此可以避免成员因类型不同而导致存储空间不同。显然,成员以每个slot的索引值来寻址。

  考虑表格驱动对象模型(见上中图1.2):

  该方案中,把所有成员分离放在数据成员表和成员函数表两个表中。类对象则含有指向这两个表的指针。

  遗憾的是,以上两种方案都没有真正应用于C++编译器中,但它们的设计思想,或多或少被有所继承。

  来看C++对象模型的实现(见上右图1.3):

  在该模型中,非静态数据成员放在类对象中,静态数据成员则放在类对象外;静态和非静态函数成员也放在类对象外;虚函数以下步骤支持:

  • 用一个虚函数表(VTBL)记录指向虚函数的指针;
  • 类对象则以一个指针(VPTR)指向虚函数表,vptr操纵由类的复制控制完成。
  • 类所关联的type_info object由虚函数表指出,位于第一个slot处。

  该模型的优点在于空间和存取时间的效率,主要缺点在于非静态数据成员修改时必须重新编译。

加上继承

  在虚拟继承的情况下,基类不管被派生多少次,都只有一个实体(subobject)。C++最初的继承模型不运用任何间接性:基类实体的数据成员被直接放在派生类对象中。后来又引入虚基类,则通过一些间接的基类表现方法。具体实现本文不做阐述,留待后续博文。

对象的差异

  C++程序设计模型直接支持三种程序设计典范:

  1.程序模型:即来自C语言的部分;

  2.抽象数据类型模型:即封装与抽象;

  3.面向对象模型:定义基类并派生出子类。

  记住,纯粹以一种典范写程序,有利于整体行为的良好稳固。

多态

  C++以下列方法支持多态:

  1.隐含的转化操作:把派生类的引用/指针转化为基类的引用/指针;

  2.虚函数机制:动态绑定;

  3.dynamic_cast和typeid运算符。

  那么,需要多少内存才能表现一个类对象呢?

  • 其非静态数据成员的总和大小;
  • 加上由译注的需求而填补上去的空间;
  • 加上为了支持virtual而产生的负担(例如:指向虚函数表的指针的大小)。

  

深度探索C++对象模型——关于对象的更多相关文章

  1. [读书系列] 深度探索C++对象模型 初读

    2012年底-2014年初这段时间主要用C++做手游开发,时隔3年,重新拿起<深度探索C++对象模型>这本书,感觉生疏了很多,如果按前阵子的生疏度来说,现在不借助Visual Studio ...

  2. 拾遗与填坑《深度探索C++对象模型》3.3节

    <深度探索C++对象模型>是一本好书,该书作者也是<C++ Primer>的作者,一位绝对的C++大师.诚然该书中也有多多少少的错误一直为人所诟病,但这仍然不妨碍称其为一本好书 ...

  3. 拾遗与填坑《深度探索C++对象模型》3.2节

    <深度探索C++对象模型>是一本好书,该书作者也是<C++ Primer>的作者,一位绝对的C++大师.诚然该书中也有多多少少的错误一直为人所诟病,但这仍然不妨碍称其为一本好书 ...

  4. 深度探索C++对象模型

    深度探索C++对象模型 什么是C++对象模型: 语言中直接支持面向对象程序设计的部分. 对于各个支持的底层实现机制. 抽象性与实际性之间找出平衡点, 需要知识, 经验以及许多思考. 导读 这本书是C+ ...

  5. 《深度探索C++对象模型》读书笔记(一)

    前言 今年中下旬就要找工作了,我计划从现在就开始准备一些面试中会问到的基础知识,包括C++.操作系统.计算机网络.算法和数据结构等.C++就先从这本<深度探索C++对象模型>开始.不同于& ...

  6. c++学习书籍推荐《深度探索C++对象模型》下载

    百度云及其他网盘下载地址:点我 百度云及其他网盘下载地址:点我 编辑推荐 如果你是一位C++程序员,渴望对于底层知识获得一个完整的了解,那么这本<深度探索C++对象模型>正适合你 作者简介 ...

  7. 读书笔记《深度探索c++对象模型》 概述

    <深度探索c++对象模型>这本书是我工作一段时间后想更深入了解C++的底层实现知识,如内存布局.模型.内存大小.继承.虚函数表等而阅读的:此外在很多面试或者工作中,对底层的知识的足够了解也 ...

  8. 柔性数组-读《深度探索C++对象模型》有感 (转载)

    最近在看<深度探索C++对象模型>,对于Struct的用法中,发现有一些地方值得我们借鉴的地方,特此和大家分享一下,此间内容包含了网上搜集的一些资料,同时感谢提供这些信息的作者. 原文如下 ...

  9. 柔性数组-读《深度探索C++对象模型》有感

    最近在看<深度探索C++对象模型>,对于Struct的用法中,发现有一些地方值得我们借鉴的地方,特此和大家分享一下,此间内容包含了网上搜集的一些资料,同时感谢提供这些信息的作者. 原文如下 ...

随机推荐

  1. CentOS虚拟机通过主机WIFI上网

    0 环境简介 环境如下: (1)宿主机为WIN7系统,连接内网,同时通过本机的WIFI上外网: (2)虚拟机为VMWare12下的CentOS7系统. 1 虚拟机设置 选择NAT 模式: 2 宿主机W ...

  2. FlexPaper+SwfTools实现的在线文档功能

    最近一个项目需要实现一个在线浏览文档的功能.准备使用FlexPaper配合Pdf2Swf实现. 主要需求在于: ➔ 文档页数很多,少则几百页,多则上千页.    ➔ 相应的文档大小也在50MB以上. ...

  3. static_cast” : 无法从“void (__thiscall CMainFrame::* )(NMTOOLBARA *,LRESULT *)”转换为“void (__thiscall CCmdTarget::* )(NMHDR *,LRESULT

    static_cast” : 无法从“void (__thiscall CMainFrame::* )(NMTOOLBARA *,LRESULT *)”转换为“void (__thiscall CCm ...

  4. POJ-3280

    Cheapest Palindrome Time Limit: 2000MS   Memory Limit: 65536K Total Submissions: 10301   Accepted: 4 ...

  5. 《深入分析Java Web技术内幕》读后感(Tomcat)

    第11章 P286 Tomcat总体结构 1.service 2.server 3.组件的生命 Connector Container 1.容器的总体设计 2.Engine容器 3.Host容器 4. ...

  6. 24.集成ASP.NETCore Identity

    正常的情况下view页面的错误的显示应该是这么去判断的 这里我们就不加判断为了,直接用这个div 显示就可以了.当有错误会自动显示在div内 asp.net core Identity加入进来 这里用 ...

  7. C# ConfigurationManager 类的使用

    一.前言 在项目中,我们习惯使用 ConfigurationManager 来读取一些常量.如链接数据库字符串.一些需配置的数据(微信.QQ.支付宝)等的配置.我们需要把这些数据记录在 app.con ...

  8. 第6章 图的学习总结(邻接矩阵&邻接表)

    我觉得图这一章的学习内容更有难度,其实图可以说是树结构更为普通的表现形式,它的每个元素都可以与多个元素之间相关联,所以结构比树更复杂,然而越复杂的数据结构在现实中用途就越大了,功能与用途密切联系,所以 ...

  9. linux和windows下安装python拓展包及requirement.txt安装类库

    python拓展包安装 直接安装拓展包默认路径: Unix(Linux)默认路径:/usr/local/lib/pythonX.Y/site-packagesWindows默认路径:C:\Python ...

  10. 2014-11-1 NOIP模拟赛1

    冲刺NOIP2014复赛模拟题第六套第二试   题目名称 日历游戏 最大公约数 密码 英文代号 calendar gcd pasuwado 输入文件名 calendar.in gcd.in pasuw ...