- 1、原创力文档(book118)网站文档一经付费(服务费),不意味着购买了该文档的版权,仅供个人/单位学习、研究之用,不得用于商业用途,未经授权,严禁复制、发行、汇编、翻译或者网络传播等,侵权必究。。
- 2、本站所有内容均由合作方或网友上传,本站不对文档的完整性、权威性及其观点立场正确性做任何保证或承诺!文档内容仅供研究参考,付费前请自行鉴别。如您付费,意味着您自己接受本站规则且自行承担风险,本站不退款、不进行额外附加服务;查看《如何避免下载的几个坑》。如果您已付费下载过本站文档,您可以点击 这里二次下载。
- 3、如文档侵犯商业秘密、侵犯著作权、侵犯人身权等,请点击“版权申诉”(推荐),也可以打举报电话:400-050-0827(电话支持时间:9:00-18:30)。
- 4、该文档为VIP文档,如果想要下载,成为VIP会员后,下载免费。
- 5、成为VIP后,下载本文档将扣除1次下载权益。下载后,不支持退款、换文档。如有疑问请联系我们。
- 6、成为VIP后,您将拥有八大权益,权益包括:VIP文档下载权益、阅读免打扰、文档格式转换、高级专利检索、专属身份标志、高级客服、多端互通、版权登记。
- 7、VIP文档为合作方或网友上传,每下载1次, 网站将根据用户上传文档的质量评分、类型等,对文档贡献者给予高额补贴、流量扶持。如果你也想贡献VIP文档。上传文档
查看更多
对象IO技术的模拟实现
精品论文 参考文献
对象IO技术的模拟实现
何洪辉① ;母军臣② (①河南大学计算中心,开封 475004;②开封大学软件学院,开封 475004)
摘要:C++对象是存活于内存中的,但是由于RAM的易失性,需要将存活于内存中的对象,通过I/O技术及时地交换到外存中,以保证对象的持久存在(对象I/O技术也称为对象的持久化,即Persistence), 所以对象I/O技术也成了C++中的一个重要操作。对象I/O技术的实现需要为对象增加一些额外的运行时信息,即RTTI,技术上的复杂性增加了开发人员所理解对象I/O的难度。本文通过对一个对象I/O技术的模拟实现,深入探讨了对象I/O技术的实现机制。
关键词:RTTI;对象I/O;对象持久化
中图分类号:TP311 文献标识码:A 文章编号:1006-4311(2010)09-0019-02
0 引言
我们知道C++对象是“存活”在RAM中的,由于RAM的易失性[1],程序需要将对象存入磁盘中,将来需要时再把对象读入内存加以恢复,这样一来就好像对象一直“活”着一样,因此对象的持久化是C++中的一个非常重要的操作。
许多程序员可能有这样的误区,利用下面的代码:saveClassName( );className=readClassName( ); p=new className;不就轻松实现对象的保存和恢复了吗?
需要指出的是,在C++中,是通过new A而非new “A”(或className =“A”,new className)实例化A的对象。换句话说,试图利用下面的代码className=readClassName( ); p = new className;来达到通过类的字符串名称动态创建对象的做法是根本行不通的,因为p = new className根本无法通过编译![2]
由此我们得出对象的持久化需要的两个条件:
①获取对象所属类的名称的能力;
②能根据类的字符串名字动态创建对象的能力。
这两种能力的获得目前有两种解决方案:
一是由C++编译器(compiler)提供——例如Borland C++ 4.5:
二是由程序员自己加上去。
本文是通过第二种方法模拟实现对象的持久化机制,从而深入探讨了对象I/O技术的实现机制。
本文结构如下,首先描述了对象持久化的实现,其次对实现进行了验证,最后是论文进行总结。
1 对象持久化的实现
为了说明问题而又不失一般性,我们假定有三个类,分别是Object, A和B,其中A和B都派生于Object,类的定义如下:
为了让对象具备持久化的两个条件,需要依次为对象添加如下信息。
1.1 为每个类增加对象创建函数CreatObject。
1.2 增加类的识别信息(类名称或ID等)以及继承信息,由于这部分信息比较多,可以将其整合到一个结构体Struct ClassInfo中。ClassInfo中保存有两个链表:类的继承链表和程序中所有类的类型信息链表。类的识别能力就由这两个链表来完成。换句话说,我们希望在main函数执行之前内存中就存在如图1所示的两个链表。其中类的继承链表是由Struct ClassInfo的带参构造函数完成的(在VC++中,结构体也可以有构造函数),而类的类型信息链表则是由ClassInfoInit类完成的。Struct ClassInfo和ClassInfoInit的定义。注意,链表的创建是在它们的构造函数中完成的。
最后一步,将类型信息作为类的静态的成员变量添加进来,并为每个类实例化静态的初始化类,目的是在main函数执行之前得到图1所示的两个链表。
在这要强调一下static关键字的作用:
①如果类的成员变量被Static关键字所修饰,则这该属性不是为类中的每个对象分别拥有,而是共用,其引用形式不是对象成员变量,而是类成员变量,即不需要市里实例化对象就可以使用。成员函数也与此相仿[3]。
②如果对象(包括作为类成员的对象),如initObject 、ObjectInfo等,被说明为Static,则这些对象是在main函数执行之前就已经存在了,换句话说,这些对象的构造函数是在main函数调用之前就已经被调用了。因此在main函数执行之前,内存中就已经存在着图1所示的链表就可以理解了。
我们添加的RTTI信息能否有效的支持对象的持久化可以由试验来验
文档评论(0)