深度探索C++对象模型(2)

深度探索C++对象模型(2),第1张

深度探索C++对象模型(2),第2张

Schlein:刚刚看了你写的《C++对象模型深度探索(一)》,感觉很不错。不过我有个建议:你很自然的会说“谁知道呢,第一章这么难消化,看了三遍,还是有点怪”。第一章是概述。如果你能全部理解,就没有必要读剩下的了。第一章的内容后面都有详细介绍,你只需要一开始就有个大概的印象。这本书里很多内容都是前后重复的。我建议你只要回头看,不管你懂不懂,然后从头看几遍,效果会好很多。

我觉得施烈音说的应该是非常好的读书方式。像《C++对象模型深度探索》这样的技术书籍,需要理解。不像学英语,不能靠死记硬背。如果看不懂,不妨把书放下,叫个红色警戒(我很自豪地说我是高手)。或者跳过去也是个好办法。好了,我们继续研究C++的对象模型。

简单对象模型

阅读一本书的例子(注释是指示solt的索引)


Class Point
{
public:
Point(float xval);//1
virtual ~ Point();//2

float x()const;//3
static int point count();//4
protected:
虚拟ostream & print(ostream & OS)const;//5
float _ x;//6
static int _ point _ count;//7
}


每个对象是一系列槽,每个槽指向一个成员。

表驱动的对象模型

当构造一个对象时,会有类似指针数组的东西,它保存指向内存中类数据成员位置的指针,以及指向成员函数的指针。为了对一个类生成的所有对象实体有一个标准的表达式,对象模型采用表,所有数据成员放在数据成员表中,所有成员函数的地址放在成员函数表中,而类对象本身有指向这两个表的指针。

为了便于理解,雷神给你举个不恰当的例子。注意,这是一个不恰当的例子。我们把写字楼当成一个类,写字楼里的人是类的数据成员,每一个租写字楼的公司都是类的成员函数。我们来看一个实体。我们称之为雷神大厦。雷神大厦的物业管理部门需要对所有进出办公楼的人进行登记,以便发放通行证。它还需要登记每个公司的房间号,并在大厅的墙上做了一个标志。其实这就是类的对象构造过程。你可以通过大堂墙上的公司名单找到任何在雷神大厦租房的公司,也可以通过物业提供的花名册找到任何进出雷神大厦的人。

真的是考验大家想象力的例子。如果你有更好的例子,别忘了和雷神交流。

c++的++对象模型

C++对象模型是从简单对象模型派生出来的,对内存空和访问时间进行了优化。介绍了虚拟表的方案。每个类生成一堆指向虚函数的指针,这些指针放在一个表中。指针(vptr)被添加到每个类的对象中,指向相关的虚拟表。这个指针由每个类的构造函数、析构函数和复制赋值操作符自动完成。

我们也以上面的雷神大厦为例。为了提高效率,物业管理不再注册长期稳定的公司和人员,也就是注册不稳定或不确定的公司,方便管理。

再次考验大家的想象力。

得出C++对象模型提高了空的效率和存储时间,但与双表对象模型相比失去了弹性。

想象一下,雷神大楼里没有人和公司的名录。如果他们改变,物业管理部门将需要做大量的工作。重新确定哪些公司和哪些人是长期稳定的。相应的应用程序需要重新编译。(这次更离谱,但为了连贯,请综合考虑,不要局限字面意思。)

这张纸条是分几次写的,连一天一个小时都保证不了(最近实在忍不住忙),所以可能会有不一致的地方。如果你看了觉得不舒服,觉得雷神的思维短路了,那很正常。不过,雷神在再次上传之前,尝试整理了一下自己的想法。我希望我能把这些单词串起来。

最后一句是“深入C++对象模型”。感觉没什么可强调的。感觉每个字都不应该放过。都是重点。雷神反复阅读后,似乎有些开窍了。继续努力,我和其他人都是。

位律师回复
DABAN RP主题是一个优秀的主题,极致后台体验,无插件,集成会员系统
白度搜_经验知识百科全书 » 深度探索C++对象模型(2)

0条评论

发表评论

提供最优质的资源集合

立即查看 了解详情