前言

对象模型是深层结构知识,关系到“与语言无关、与平台无关、跨网络可执行”软件组件的基础。

C++相对于精瘦的C来说,多了许多特性,正因如此,我们更有必要去探索、了解C++对象模型,到底背着我们又发生了什么事情。在了解C++对象模型之前,有必要先从简单一点的两个模型入手:简单对象模型表格驱动模型

简单对象模型

现在我们考虑一个Point类,其声明如下:

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

在C++中,成员数据(class data member)有两种:staticnonstatic,成员函数(class member function)有三种:staticnonstaticvirtual

那么上述的Point类,用简单对象模型应该怎么塑模这些data membersfunction members呢,如下:

                  

这个对象模型比较简单,在这个简单模型中,object中存放的并不是member而是一系列的slots,每个slot指向一个member,按memberclass中的声明顺序,即object中存放的是“指向member的指针”,这就避免了因不同类型的member需要不同存储空间所带来的问题。

表格驱动模型

与简单对象模型类似,但又有所不同。表格驱动对象模型将class中的member分成datafunction两个部分,一个放在data member table中,一个放在member function table中,而class object则持有指向这两个table的指针。在往下划分,data member table直接存放data本身,而member function table则是一系列的slots,每个slot指向一个member function,如下。

这种对象模型不会因classdata membermember function的增减而改变其大小,但在操作member function时,比data member多了一次寻址。

CPlusPlus对象模型

C++对象模型是从简单对象模型派生而来的,并对内存空间和存取时间做了优化。在此模型中对data而言nonstatic data member被置于class object之内,static data member被置于class object之外;对function而言,staticnonstatic member function被置于class object之外,virtual member function则由以下两步支持:

       1、每一个class产生出一堆指向virtual function的指针,并存放于表格中,即virtual tablevtbl);

       2、每个class object被安插一个指针(vptr),指向相关的virtual table

上面两点是用以支持virtual function的。在C++中,关键字virtual的存在只有两处,一出现在member function之前形成virtual function,二出现在inheritance时形成virtual inheritance(虚拟继承),若base classderived class不是以上两种情况,也无virtual table之说了。如下。

另外,在C++对象模型中我们可以看到vptr指向的virtual table中多了一个type_info,并且位于vtbl的第一个slot,这是用以支持rumtime type identificationRTTI)的,这个后面的学习笔记再说。vptr这个指针的设定、重置都由每一个classconstructordestructorcopy assignment运算符自动完成。

更进一步的说,pt->vtbl[0]指向Pointtype_info objectpt->vtbl[1]指向Point::~Point()pt->vtbl[2]指向Point::print()

参考资料:

[1] 深度探索C++对象模型,[美]Stanley B. Lippman著,侯捷译;

[2] C++对象模型,吴秦(http://www.cnblogs.com/skynet/)

《深度探索C++对象模型》:简单对象模型、表格驱动模型、C++对象模型相关推荐

  1. Android深度探索(卷1)HAL与驱动开发阅读心得4

    Android源代码包含内嵌在Android系统中的应用程序的源代码.Android SDK带的各种工具的源代码.Android NDK的源代码.HAL源代码. Android源代码目录 makefi ...

  2. Android深度探索(卷1)HAL与驱动开发 读书笔记(第四章)

    第四章  源代码的下载和编译 本章主要介绍使用Git下载两套源代码.一套是Android 源代码,另一套是Linux 内核源代码.主要介绍如何下载和编译Android源代码和Linux内核源代码. 4 ...

  3. 深度探索as3的事件机制

    as3的事件机制很好用了.但要用好,用对,就得详细了解它的事件模型.本文将深度探索as3事件的各个方面. 1.事件模型 as3的事件系统包括 dispatchers(派发器),listeners(监听 ...

  4. 整理--linux设备驱动模型

    知识整理–linux设备驱动模型 以kobject为底层,组织类class.总线bus.设备device.驱动driver等高级数据结构,同时实现对象引用计数.维护对象链表.对象上锁.对用户空间的表示 ...

  5. RK3568平台开发系列讲解(驱动篇) linux设备驱动模型

    文章目录 linux设备驱动模型 为什么需要设备驱动模型 sysfs概述 设备驱动模型基本元素 驱动模型一 驱动模型二 kobject kset kobj_type linux设备驱动模型 为什么需要 ...

  6. 深度探索C++对象模型——关于对象

    引言 以前读<C++ Primer>的时候一直有一种感觉:该书虽然是C++入门书籍,初学者读之却觉晦涩,越往后读越是如此.等到稍加理解后再读该书,顿感醍醐灌顶,茅塞顿开.究其原因,在于原作 ...

  7. 深度探索C++ 对象模型(1)-三种对象模型的设计

    1.类的成员 数据成员 . Static . Nonstatic 成员函数 . Static . Nonstatic . virtual Questions: C++封装带来的布局成本是多大? 由空类 ...

  8. 《深度探索C++对象模型(Inside The C++ Object Model )》学习笔记

    来源:http://dsqiu.iteye.com/blog/1669614 之前一直对C++内部的原理的完全空白,然后找到<Inside The C++ Object Model>这本书 ...

  9. 《深度探索C++对象模型》--5 构造析构拷贝 6 执行期语意学

     <深度探索C++对象模型>--5构造.析构.拷贝语意学 1.纯虚函数: (1)C++可以定义和调用一个纯虚函数,不过只可以静态调用,不可以由虚拟机制调用. 注意:pure virtu ...

最新文章

  1. 机器学习PAL数据可视化
  2. mac terminal vim delete key
  3. linux系统支持游戏,3种方法让Linux系统支持游戏
  4. Elasticsearch【快速入门】
  5. Dockerfile的介绍
  6. html调用chr,PHP: 使用chr打印汉字
  7. linux c之用命名管道实现进程通信
  8. Java 注解:@PostConstruct和@PreConstruct
  9. SpringBoot集成MyBatis的分页插件PageHelper
  10. 实现简单的字符串队列
  11. 【跃迁之路】【712天】程序员高效学习方法论探索系列(实验阶段469-2019.2.2)...
  12. quartus仿真20:模8的二进制计数器
  13. adb工具构成及原理
  14. 最新Thinkphp免签码支付系统源码+安卓监控端/实测可用
  15. mac下Flash cc2014的破解方法
  16. 微软各产品的生命周期
  17. 虚拟小镇意识保存~认识脑电波
  18. 基于python下django框架 实现外卖点餐系统详细设计
  19. 招行股东会通过收购永隆银行议案
  20. MySQL 1366错误

热门文章

  1. java调用sdtapi.dll读取身份证设备信息的一次记录
  2. GemPooling
  3. BERT中的Tokenizer说明
  4. 0xC0000374: 堆已损坏。 (参数: 0x777DB960)
  5. Java 访问 复制 粘贴 剪切板
  6. 面试了300+的QA候选人,有些话,我想悄悄告诉你——作者晴空
  7. [PTA]练习4-6 猜数字游戏
  8. 大二初学者用c++实现平抛运动
  9. 计算机机房屏蔽接地设计方案,计算机屏蔽机房接地方案.doc
  10. 《我要进大厂》- Java并发 夺命连环10问,你能坚持到第几问?(进程线程 | 并行并发 | 上下文切换 | 线程死锁 | 线程创建)