C++继承内存分布(带虚函数)及动态绑定细节.doc.doc

C++继承内存分布(带虚函数)及动态绑定细节.doc.doc

  1. 1、原创力文档(book118)网站文档一经付费(服务费),不意味着购买了该文档的版权,仅供个人/单位学习、研究之用,不得用于商业用途,未经授权,严禁复制、发行、汇编、翻译或者网络传播等,侵权必究。。
  2. 2、本站所有内容均由合作方或网友上传,本站不对文档的完整性、权威性及其观点立场正确性做任何保证或承诺!文档内容仅供研究参考,付费前请自行鉴别。如您付费,意味着您自己接受本站规则且自行承担风险,本站不退款、不进行额外附加服务;查看《如何避免下载的几个坑》。如果您已付费下载过本站文档,您可以点击 这里二次下载
  3. 3、如文档侵犯商业秘密、侵犯著作权、侵犯人身权等,请点击“版权申诉”(推荐),也可以打举报电话:400-050-0827(电话支持时间:9:00-18:30)。
查看更多
C++继承内存分布(带虚函数)及动态绑定细节.doc.doc

C++继承关系(含虚函数) 内存结构分析 以及 动态绑定的细节分析 说明 本文较为深入的研究C++的继承(含多重继承)情况下带虚函数时的实例内存结构,较为深入的剖析了继承实例间是如何组织的,以及动态绑定的实现细节。 依据 以下阐述的细节均依据VS2005 生成的DEBUG模式程序在IDA Pro5.2反编译所得,部分数据结构根据程序分析得出。 术语说明 对于以下将频繁用到的术语,我可能简写为如下 classX:RTTI_COL x 原语:classX:RTTI Complete Object Locator {for x} classX:RTTI_CHD 原语:classX:RTTI class Hierarchy Descriptor classX:RTTI_BCD 原语:classX:RTTI Base class Descriptor 以上简写均采用单词首字母缩写,其中Derive表示派生类,x表示Derive的一个基类,classX表示以上任意类 Derive :RTTI_COL xvirtual Derive::fun1(overwrite by derive class) for base Avirtual A::fun2(inherit from base A) for base A. . . . . .virtual fun(if derive own virtual itslef) for derive * perhaps not分析 1. 派生类内存分布及虚表 vfTable for base Adata of base AvfTable for base Bdata of base Bdata of Derive itself Figure 1:派生类实例对象内存分布及虚表映射 如上图,其中左部为派生类class的实例对象内存格局(继承来自A,B),其中第一项为base A的虚表地址(A,B数据在class实例中布局顺序是按照Derive在声明时继承顺序决定的),从图中箭头可知base A的虚表地址指向了一个数组,里面存放了Derive对应的虚函数地址: ① 首先存放重写过的base A声明的的虚函数地址(如果虚函数是从基类继承过来的,那么虚表中存放的也是base A中该函数地址)。 ② 然后存放Derive自己声明的虚函数(可能没有)。 *注意:vfTable地址指向的虚表是从右边表格黄色以下位置开始,黄色以上是虚表附加信息,不为虚表所有,为本人IDA Pro反汇编分析所得。 其中Derive :RTTI_COL x是定位对象所使用的相关数据结构,其结构经反汇编如下: classX :RTTI Complete Object Locator {for x} FieldLengthRemarkreserve_14not used,filled with 0x00offset_x4the offset of vfTable( for x) and the base address of classX reserve_34not used,filled with 0x00pTypeDescriptor4address of classX:RTTI Type DescriptorpHierarchyDescriptor4address of classX:RTTI class Hierarchy DescriptorFigure 2: classX : RTTI Complete Object Locator {for x}反汇编结构 offset_x字段描述 基类x在classX实例内存空间中的起始地址相对于classX基址的偏移(也就是x的vfTable字段在classX内存布局中的偏移) pHierarchyDescriptor字段存放classX:RTTI class Hierarchy Descriptor 结构的地址,该结构描述了Derive类的内存结构层次信息。 ***Remark:对于classX为派生类Derive情况时,该结构描述了基类x相对于Derive的信息,此时表格中所有classX均应以Derive替换;但是当classX为基类x情况时,该结构描述了基类自身的信息,此时表格中所有classX均应以x替换 classX:RTTI class Hierarchy Descriptor FieldLengthRemarkreserve_14unknownreserve_24unknowndwArrayElemCount4the count of the el

文档评论(0)

170****0532 + 关注
实名认证
内容提供者

该用户很懒,什么也没介绍

版权声明书
用户编号:8015033021000003

1亿VIP精品文档

相关文档