C++对象的内存布局..docVIP

  1. 1、原创力文档(book118)网站文档一经付费(服务费),不意味着购买了该文档的版权,仅供个人/单位学习、研究之用,不得用于商业用途,未经授权,严禁复制、发行、汇编、翻译或者网络传播等,侵权必究。。
  2. 2、本站所有内容均由合作方或网友上传,本站不对文档的完整性、权威性及其观点立场正确性做任何保证或承诺!文档内容仅供研究参考,付费前请自行鉴别。如您付费,意味着您自己接受本站规则且自行承担风险,本站不退款、不进行额外附加服务;查看《如何避免下载的几个坑》。如果您已付费下载过本站文档,您可以点击 这里二次下载
  3. 3、如文档侵犯商业秘密、侵犯著作权、侵犯人身权等,请点击“版权申诉”(推荐),也可以打举报电话:400-050-0827(电话支持时间:9:00-18:30)。
  4. 4、该文档为VIP文档,如果想要下载,成为VIP会员后,下载免费。
  5. 5、成为VIP后,下载本文档将扣除1次下载权益。下载后,不支持退款、换文档。如有疑问请联系我们
  6. 6、成为VIP后,您将拥有八大权益,权益包括:VIP文档下载权益、阅读免打扰、文档格式转换、高级专利检索、专属身份标志、高级客服、多端互通、版权登记。
  7. 7、VIP文档为合作方或网友上传,每下载1次, 网站将根据用户上传文档的质量评分、类型等,对文档贡献者给予高额补贴、流量扶持。如果你也想贡献VIP文档。上传文档
查看更多
C++ 对象的内存布局(C++ 虚函数表解析续) 07年12月,我写了一篇《C++虚函数表解析》的文章,引起了大家的兴趣。有很多朋友对我的文章留了言,有鼓励我的,有批评我的,还有很多问问题的。我在这里一并对大家的留言表示感谢。这也是我为什么再写一篇续言的原因。因为,在上一篇文章中,我用了的示例都是非常简单的,主要是为了说明一些机理上的问题,也是为了图一些表达上方便和简单。不想,这篇文章成为了打开C++对象模型内存布局的一个引子,引发了大家对C++对象的更深层次的讨论。当然,我之前的文章还有很多方面没有涉及,从我个人感觉下来,在谈论虚函数表里,至少有以下这些内容没有涉及: 1)有成员变量的情况。 2)有重复继承的情况。 3)有虚拟继承的情况。 4)有钻石型虚拟继承的情况。 这些都是我本篇文章需要向大家说明的东西。所以,这篇文章将会是《C++虚函数表解析》的一个续篇,也是一篇高级进阶的文章。我希望大家在读这篇文章之前对C++有一定的基础和了解,并能先读我的上一篇文章。因为这篇文章的深度可能会比较深,而且会比较杂乱,我希望你在读本篇文章时不会有大脑思维紊乱导致大脑死机的情况。;-) 对象的影响因素 简而言之,我们一个类可能会有如下的影响因素: 1)成员变量 2)虚函数(产生虚函数表) 3)单一继承(只继承于一个类) 4)多重继承(继承多个类) 5)重复继承(继承的多个父类中其父类有相同的超类) 6)虚拟继承(使用virtual方式继承,为了保证继承后父类的内存布局只会存在一份) 上述的东西通常是C++这门语言在语义方面对对象内部的影响因素,当然,还会有编译器的影响(比如优化),还有字节对齐的影响。在这里我们都不讨论,我们只讨论C++语言上的影响。 本篇文章着重讨论下述几个情况下的C++对象的内存布局情况。 1)单一的一般继承(带成员变量、虚函数、虚函数覆盖) 2)单一的虚拟继承(带成员变量、虚函数、虚函数覆盖) 3)多重继承(带成员变量、虚函数、虚函数覆盖) 4)重复多重继承(带成员变量、虚函数、虚函数覆盖) 5)钻石型的虚拟多重继承(带成员变量、虚函数、虚函数覆盖) 我们的目标就是,让事情越来越复杂。 知识复习 我们简单地复习一下,我们可以通过对象的地址来取得虚函数表的地址,如: typedef void(*Fun)(void); Base b; Fun pFun = NULL; cout 虚函数表地址: (int*)(b) endl; cout 虚函数表 — 第一个函数地址: (int*)*(int*)(b) endl; // Invoke the first virtual function pFun = (Fun)*((int*)*(int*)(b)); pFun(); 我们同样可以用这种方式来取得整个对象实例的内存布局。因为这些东西在内存中都是连续分布的,我们只需要使用适当的地址偏移量,我们就可以获得整个内存对象的布局。 本篇文章中的例程或内存布局主要使用如下编译器和系统: 1)Windows XP 和 VC++ 2003 2)Cygwin 和 G++ 3.4.4 单一的一般继承 下面,我们假设有如下所示的一个继承关系: 请注意,在这个继承关系中,父类,子类,孙子类都有自己的一个成员变量。而了类覆盖了父类的f()方法,孙子类覆盖了子类的g_child()及其超类的f()。 我们的源程序如下所示: class Parent { public: int iparent; Parent ():iparent (10) {} virtual void f() { cout Parent::f() endl; } virtual void g() { cout Parent::g() endl; } virtual void h() { cout Parent::h() endl; } }; class Child : public Parent { public: int ichild; Child():ichild(100) {} virtual void f() { cout Child::f() endl; } virtual void g_child() { cout Child::g_child() endl; } virtual void h_child() { cout Child::h_child() endl; } }; class GrandChild : public Child{ public: int igrandchild; GrandChild():igrandchild(1000) {} virtual void f() { cout GrandC

文档评论(0)

dbtx + 关注
实名认证
文档贡献者

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

1亿VIP精品文档

相关文档