c++虚继承对象的内存布局
--VC7.1特别版
网上关于c++对象布局的文章挺多,而且《深度探索c++对象模型》(Inside The C++ Object Model 侯捷 译)一书中也很详细地介绍。如果你一点都不了解C++对象的布局,我推荐你看看《深度探索c++对象模型》的第三章,如果你意犹未尽下面的两个系列都很不错:
一是陈皓的《C++ 对象的内存布局》图文并貌,写得很是详细。地址是http://blog.csdn.net/haoel/archive/2008/10/15/3081328.aspx。
二是玄机逸士的《对象内存布局》系列则几乎把每种可能性列出来了,尤为详尽。地址是http://blog.csdn.net/pathuang68/archive/2009/04/23/4101970.aspx。
读了以上好文,对于c++对象的布局其实应该是山水了然于胸了,不过我最在写一个用c++模仿C#事件机制的东东,但发觉得有很几处细节不是很明了,而且陈皓朋友也在最后提出了一个问题,虽然有网友答之,仍语言不详。而我却必需深入了解此,才能真正实做出C++的事件。
此文应该算是狗尾续貂之作,高手可能会不屑一顾。不过希望还是对一些朋友有帮助。因为对于普通类的对象布局,前人备述已,我也不太可能写出什么新意来,更多的是因为我比较懒。呵呵,本文所探讨的就是那种极端复杂的菱形结构如下:
class A ;
class B : virtual public A;
class C : virtual public B;
class D : public B,public C;
好了,来了,我们从最基础的的讨论起。当c++支持virtual base class 时,就会多了一些额外负担,当class 中内含一个或多个virtual base class subobject时,将分成两个部分,一个不变局部和一个共享局部。最初的方案是为每一个虚基类安插一个指针指向这个虚基类,其缺点是为了负担太重,而且当虚继承链加长时,导致间接存取时间加长(需通过多次跳转)。因此有两种解决方案(《深入》一书中所提):
一、是引入virtual base class table,不管多少个虚基类,总是只有一个指针指向它,这个

本文探讨了C++中虚继承对象的内存布局,重点在于虚拟基类的处理方式。通过分析VC7.1的实现,指出存在一个指向虚拟基类表(VBTBL)的指针,该表包含虚基类相对于类的偏移地址。文章还通过实例展示了类`Test`的内存布局,并对比了不同设计方案的优缺点。最后,提供了一个完整的例子,展示了`A`, `B`, `C`, 和 `D`类的内存结构布局。"
120448448,10714295,集群环境下日志采集:Flume+Kafka+Es实践,"['日志处理', '数据采集', 'Elasticsearch', 'Kafka', 'Flume']
最低0.47元/天 解锁文章
4383

被折叠的 条评论
为什么被折叠?



