《深度探索C++对象模型》:简单对象模型、表格驱动模型、C++对象模型
前言
对象模型是深层结构知识,关系到“与语言无关、与平台无关、跨网络可执行”软件组件的基础。
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)有两种:static和nonstatic,成员函数(class member function)有三种:static、nonstatic和virtual。
那么上述的Point类,用简单对象模型应该怎么塑模这些data members和function members呢,如下:
这个对象模型比较简单,在这个简单模型中,object中存放的并不是member而是一系列的slots,每个slot指向一个member,按member在class中的声明顺序,即object中存放的是“指向member的指针”,这就避免了因不同类型的member需要不同存储空间所带来的问题。
表格驱动模型
与简单对象模型类似,但又有所不同。表格驱动对象模型将class中的member分成data和function两个部分,一个放在data member table中,一个放在member function table中,而class object则持有指向这两个table的指针。在往下划分,data member table直接存放data本身,而member function table则是一系列的slots,每个slot指向一个member function,如下。
这种对象模型不会因class中data member和member function的增减而改变其大小,但在操作member function时,比data member多了一次寻址。
CPlusPlus对象模型
C++对象模型是从简单对象模型派生而来的,并对内存空间和存取时间做了优化。在此模型中对data而言nonstatic data member被置于class object之内,static data member被置于class object之外;对function而言,static和nonstatic member function被置于class object之外,virtual member function则由以下两步支持:
1、每一个class产生出一堆指向virtual function的指针,并存放于表格中,即virtual table(vtbl);
2、每个class object被安插一个指针(vptr),指向相关的virtual table。
上面两点是用以支持virtual function的。在C++中,关键字virtual的存在只有两处,一出现在member function之前形成virtual function,二出现在inheritance时形成virtual inheritance(虚拟继承),若base class或derived class不是以上两种情况,也无virtual table之说了。如下。
另外,在C++对象模型中我们可以看到vptr指向的virtual table中多了一个type_info,并且位于vtbl的第一个slot,这是用以支持rumtime type identification(RTTI)的,这个后面的学习笔记再说。vptr这个指针的设定、重置都由每一个class的constructor、destructor和copy assignment运算符自动完成。
更进一步的说,pt->vtbl[0]指向Point的type_info object,pt->vtbl[1]指向Point::~Point(),pt->vtbl[2]指向Point::print()。
参考资料:
[1] 深度探索C++对象模型,[美]Stanley B. Lippman著,侯捷译;
[2] C++对象模型,吴秦(http://www.cnblogs.com/skynet/)
《深度探索C++对象模型》:简单对象模型、表格驱动模型、C++对象模型相关推荐
- Android深度探索(卷1)HAL与驱动开发阅读心得4
Android源代码包含内嵌在Android系统中的应用程序的源代码.Android SDK带的各种工具的源代码.Android NDK的源代码.HAL源代码. Android源代码目录 makefi ...
- Android深度探索(卷1)HAL与驱动开发 读书笔记(第四章)
第四章 源代码的下载和编译 本章主要介绍使用Git下载两套源代码.一套是Android 源代码,另一套是Linux 内核源代码.主要介绍如何下载和编译Android源代码和Linux内核源代码. 4 ...
- 深度探索as3的事件机制
as3的事件机制很好用了.但要用好,用对,就得详细了解它的事件模型.本文将深度探索as3事件的各个方面. 1.事件模型 as3的事件系统包括 dispatchers(派发器),listeners(监听 ...
- 整理--linux设备驱动模型
知识整理–linux设备驱动模型 以kobject为底层,组织类class.总线bus.设备device.驱动driver等高级数据结构,同时实现对象引用计数.维护对象链表.对象上锁.对用户空间的表示 ...
- RK3568平台开发系列讲解(驱动篇) linux设备驱动模型
文章目录 linux设备驱动模型 为什么需要设备驱动模型 sysfs概述 设备驱动模型基本元素 驱动模型一 驱动模型二 kobject kset kobj_type linux设备驱动模型 为什么需要 ...
- 深度探索C++对象模型——关于对象
引言 以前读<C++ Primer>的时候一直有一种感觉:该书虽然是C++入门书籍,初学者读之却觉晦涩,越往后读越是如此.等到稍加理解后再读该书,顿感醍醐灌顶,茅塞顿开.究其原因,在于原作 ...
- 深度探索C++ 对象模型(1)-三种对象模型的设计
1.类的成员 数据成员 . Static . Nonstatic 成员函数 . Static . Nonstatic . virtual Questions: C++封装带来的布局成本是多大? 由空类 ...
- 《深度探索C++对象模型(Inside The C++ Object Model )》学习笔记
来源:http://dsqiu.iteye.com/blog/1669614 之前一直对C++内部的原理的完全空白,然后找到<Inside The C++ Object Model>这本书 ...
- 《深度探索C++对象模型》--5 构造析构拷贝 6 执行期语意学
<深度探索C++对象模型>--5构造.析构.拷贝语意学 1.纯虚函数: (1)C++可以定义和调用一个纯虚函数,不过只可以静态调用,不可以由虚拟机制调用. 注意:pure virtu ...
最新文章
- 机器学习PAL数据可视化
- mac terminal vim delete key
- linux系统支持游戏,3种方法让Linux系统支持游戏
- Elasticsearch【快速入门】
- Dockerfile的介绍
- html调用chr,PHP: 使用chr打印汉字
- linux c之用命名管道实现进程通信
- Java 注解:@PostConstruct和@PreConstruct
- SpringBoot集成MyBatis的分页插件PageHelper
- 实现简单的字符串队列
- 【跃迁之路】【712天】程序员高效学习方法论探索系列(实验阶段469-2019.2.2)...
- quartus仿真20:模8的二进制计数器
- adb工具构成及原理
- 最新Thinkphp免签码支付系统源码+安卓监控端/实测可用
- mac下Flash cc2014的破解方法
- 微软各产品的生命周期
- 虚拟小镇意识保存~认识脑电波
- 基于python下django框架 实现外卖点餐系统详细设计
- 招行股东会通过收购永隆银行议案
- MySQL 1366错误
热门文章
- java调用sdtapi.dll读取身份证设备信息的一次记录
- GemPooling
- BERT中的Tokenizer说明
- 0xC0000374: 堆已损坏。 (参数: 0x777DB960)
- Java 访问 复制 粘贴 剪切板
- 面试了300+的QA候选人,有些话,我想悄悄告诉你——作者晴空
- [PTA]练习4-6 猜数字游戏
- 大二初学者用c++实现平抛运动
- 计算机机房屏蔽接地设计方案,计算机屏蔽机房接地方案.doc
- 《我要进大厂》- Java并发 夺命连环10问,你能坚持到第几问?(进程线程 | 并行并发 | 上下文切换 | 线程死锁 | 线程创建)