inside C++笔记之C++对象模型

来源:互联网 发布:linux mysql root权限 编辑:程序博客网 时间:2024/04/28 06:01

首先看下Point

i.简单对象模型,
在这个模型中,一个object是一系列的slots,每一个slot指向一个member.Members按其声明次序,各被指定一个slot,每一个data member 或 function member 都有自己的一个slot.

如果所示:

 

在简单模型中,Member本身并不放在object之中,只有“指向member的指针”才放在object内,这么做可以避免“members有不同的类型,因而需要不同的存储空间”所招致的问题Object中的member是根据索引来寻址,object的大小是member数乘以指针大小。这个模型的关于索引或slot数目的观念被应用到C++的“指向成员的指针”观念之中。

 

ii. 表格驱动对象模型

这个模型中把所有membert相关的信息全部抽取出来,放在两个table中:data member tablefunction member table.function member talbe是一系列的slots,每个slot指向一个member functionData member table 包含data的本身。Object包含指向这两个talbe的指针。

如图所示:

这个模型的member function table这个观念应用到C++模型中的vitrual functions中。

 

 iii.C++对象模型
这个模型中,nonstatic data member被配置在每一个object内,static data member被放置在object之外。无论是nonstatic function member或是static function member都放置在object之外。对virtual function有两个步骤:
1. 每一个object产生一堆指向virtual function的指针,把这些指针放在一个table中,称之为virtrual talbe(vtbl)
2. 每一个object添加一个指向这个vtbl的指针,称之为vptr。Vptr的设定和重置都是由每一个class的constructor,destructor和copy assignment运算符自动完成。每一个class所关联的type_info object也经由virtual table被指出来,通常放在表格的第一个slot处。

如图所示:

这个模型的主要优点是空间和存取时间的效率,主要缺点则是,如果应用程序的代码本身未曾改变,但所用到的class objects的nonstatic data members有所修改(增加,删除或更改),那么那些应用程序用样重新编译。

原创粉丝点击