C++对象模型

来源:互联网 发布:win10 手写笔软件 编辑:程序博客网 时间:2024/06/16 06:15

简单对象模型

image

简单对象模型:一个C++对象存储了所有指向成员的指针,而成员本身不存储在对象中。也就是说不论数据成员还是成员函数,也不论这个是普通成员函数还是虚函数,它们都存储在对象本身之外,同时对象保存指向它们的指针。示意图如右。

简单对象模型对于编译器来说虽然极尽简单,但同时付出的代价是空间和执行期的效率.显而易见的是对于每一个成员都要额外搭上一个指针大小的空间以及对于每成员的操作都增加了一个间接层.因此C++并没有采用这样一种对象模型,但是被用到了C++中“指向成员的指针”的概念当中。

 

 

表格驱动对象模型

image

表格驱动模型则更绝,它将对象中所有的成员都抽离出来在外建表,而对象本身只存储指向这个表的指针。右图可以看到,它将所有的数据成员抽离出来建成数据成员表,将所有的函数抽取出来建成一张函数成员表,而对象本身只保持一个指向数据成员表的指针。

侯大大认为,在对象与成员函数表中间应当加一个虚箭头,他认为这是Lippman的疏漏之处,应当在对象中保存指向函数成员表的指针。

然而我在这儿还是保留原书(而非译本)的截图,因为以我之拙见,不保存指向成员函数表的指针也没有妨碍。因为形如float Point::x() 的成员函数实际上相当于floatx(Point* )类型的普通函数,因此保存指向成员函数表的指针当属多此一举。

当然C++也没有采用这一种对象模型,但C++却以此模型作为支持虚函数的方案。

 

C++对象模型

所有的非静态数据成员存储在对象本身中。所有的静态数据成员、成员函数(包括静态与非静态)都置于对象之外。另外,用一张虚函数表(virtual table)存储所有指向虚函数的指针,并在表头附加上一个该类的type_info 对象,在对象中则保存一个指向虚函数表的指针。如下图:

image

原创粉丝点击