c++对象存储方式解读.docx

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

C++对象模型何为C++对象模型?C++对象模型可以概括为以下2部分:1.????????语言中直接支持面向对象程序设计的部分2.????????对于各种支持的底层实现机制语言中直接支持面向对象程序设计的部分,如构造函数、析构函数、虚函数、继承(单继承、多继承、虚继承)、多态等等,这也是组里其他同学之前分享过的内容。第一部分这里我简单过一下,重点在底层实现机制。在c语言中,“数据”和“处理数据的操作(函数)”是分开来声明的,也就是说,语言本身并没有支持“数据和函数”之间的关联性。在c++中,通过抽象数据类型(abstract data type,ADT),在类中定义数据和函数,来实现数据和函数直接的绑定。概括来说,在C++类中有两种成员数据:static、nonstatic;三种成员函数:static、nonstatic、virtual。如下面的Base类定义:Base类定义:#pragma?once#includeiostreamusing?namespace?std;class?Base{public:????Base(int);????virtual?~Base(void);?????int?getIBase()?const;????static?int?instanceCount();????virtual?void?print()?const;?protected:?????int?iBase;????static?int?count;};Base类在机器中我们如何构建出各种成员数据和成员函数的呢?基本C++对象模型在介绍C++使用的对象模型之前,介绍2种对象模型:简单对象模型(a simple object model)、表格驱动对象模型(a table-driven object model)。简单对象模型(a simple object model)所有的成员占用相同的空间(跟成员类型无关),对象只是维护了一个包含成员指针的一个表。表中放的是成员的地址,无论上成员变量还是函数,都是这样处理。对象并没有直接保存成员而是保存了成员的指针。表格对象模型(a table-driven object model)这个模型在简单对象的基础上又添加了一个间接层。将成员分成函数和数据,并且用两个表格保存,然后对象只保存了两个指向表格的指针。这个模型可以保证所有的对象具有相同的大小,比如简单对象模型还与成员的个数相关。其中数据成员表中包含实际数据;函数成员表中包含的实际函数的地址(与数据成员相比,多一次寻址)。C++对象模型这个模型从结合上面2中模型的特点,并对内存存取和空间进行了优化。在此模型中,non static?数据成员被放置到对象内部,static数据成员,?static and nonstatic?函数成员均被放到对象之外。对于虚函数的支持则分两步完成:1.??????每一个class产生一堆指向虚函数的指针,放在表格之中。这个表格称之为虚函数表(virtual table,vtbl)。2.??????每一个对象被添加了一个指针,指向相关的虚函数表vtbl。通常这个指针被称为vptr。vptr的设定(setting)和重置(resetting)都由每一个class的构造函数,析构函数和拷贝赋值运算符自动完成。另外,虚函数表地址的前面设置了一个指向type_info的指针,RTTI(Run Time Type Identification)运行时类型识别是有编译器在编译器生成的特殊类型信息,包括对象继承关系,对象本身的描述,RTTI是为多态而生成的信息,所以只有具有虚函数的对象在会生成。这个模型的优点在于它的空间和存取时间的效率;缺点如下:如果应用程序本身未改变,但当所使用的类的non static数据成员添加删除或修改时,需要重新编译。模型验证测试为了验证上述C++对象模型,我们编写如下测试代码。模型验证测试:void?test_base_model(){????Base?b1(1000);????cout ?对象b1的起始内存地址:? b1 endl;????cout ?type_info信息:? ((int*)*(int*)(b1) - 1) endl;????RTTICompleteObjectLocator?str=????????*((RTTICompleteObjectLocator*)*((int*)*(int*)(b1) - 1));????//abstract class name from RTTI????string?classname(str.pTypeDescriptor-name);????classname = classname.substr(4,classname.find(@@

文档评论(0)

shuwkb + 关注
实名认证
内容提供者

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

1亿VIP精品文档

相关文档