对象IO技术的模拟实现_第1页
对象IO技术的模拟实现_第2页
对象IO技术的模拟实现_第3页
对象IO技术的模拟实现_第4页
全文预览已结束

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

1、对象10技术的模拟实现何洪辉;母军臣(河南大学计算中心,开封475004;开封大学软件 学院,开封475004)摘要:c+对象是存活于内存中的,但是由于ram的易失性,需要将存活于内存 中的对象,通过i/o技术及时地交换到外存中,以保证对象的持久存在(对象i/o 技术也称为对象的持久化,即persistence),所以对象i/o技术也成了 c+中的 一个重要操作。对象i/o技术的实现需要为对象增加一些额外的运行时信息,即 rtti,技术上的复杂性增加了开发人员所理解对象i/o的难度。本文通过对一个 对象i/o技术的模拟实现,深入探讨了对象i/o技术的实现机制。关键词:rtti;对象i/o;对象

2、持久化中图分类号:tp311文献标识码:a文章编号:1006-4311 (2010) 09-0019-020引言我们知道c+对象是“存活”在ram中的,由于ram的易失性,程 序需要将对象存入磁盘中,将来需要时再把对象读入内存加以恢复,这样一来就 好像对象一直“活”着一样,因此对象的持久化是c+中的一个非常重要的操作。许多程序员可能有这样的误区,利用下面的代码:saveclassname (); classname=readclassname ( ); p=new classname;不就轻松实现对象的保存和 恢复了吗?需要指出的是,在c+中,是通new a而非new “a”(或classna

3、me=“a”,new classname)实例化a的对象。换句话说,试图利用下面的代码 classname=readclassname ( ); p 二 new classname;来达到通过类的字符串名 称动态创建对象的做法是根木行不通的,因为p = new classname根木无法通过 编译! 2由此我们得出对象的持久化需要的两个条件: 获取对象所属类的名称的能力; 能根据类的字符串名字动态创建对象的能力。这两种能力的获得a前有两种解决方案:一是由 c+编译器(compiler)提供例如 borland c+ 4.5:二是由程序员自己加上去。本文是通过第二种方法模拟实现对象的持久化机制,

4、从而深入探讨了对 象i/o技术的实现机制。本文结构如下,首先描述了对象持久化的实现,其次对实现进行了验证, 最后是论文进行总结。1对象持久化的实现为了说明问题而又不失一般性,我们假定有三个类,分别是object, a 和b,其中a和b都派生于object,类的定义如下:为了让对象具备持久化的两个条件,需要依次为对象添加如下信息。1.1为每个类增加对象创建函数creatobjecto1.2增加类的识别信息(类名称或id等)以及继承信息,由于这部分信息比较多,可以将其整合到一个结构体struct classinfo中。classinfo中保存有 两个链表:类的继承链表和程序中所有类的类型信息链表。

5、类的识别能力就由这 两个链表来完成。换句话说,我们希望在main函数执行之前内存中就存在如图 1所示的两个链表。其中类的继承链表是由struct classinfo的带参构造函数完成 的(在vc+中,结构体也可以有构造函数),而类的类型信息链表则是由 classlnfolnit 类完成的。struct classinfo 和 classlnfolnit 的定义。注意,链表的创 建是在它们的构造函数中完成的。最后一步,将类型信息作为类的静态的成员变量添加进来,并为每个类 实例化静态的初始化类,目的是在main函数执行之前得到图1所示的两个链表。在这要强调一下static关键字的作用:如果类的成员

6、变量被static关键字所修饰,则这该属性不是为类中的 每个对象分别拥有,而是共用,其引用形式不是对象成员变量,而是类成员变量, 即不需要市里实例化对象就可以使用。成员函数也与此相仿3。如果对象(包括作为类成员的对象),如initobject、objectinfo等, 被说明为static,则这些对象是在main函数执行之前就已经存在了,换句话说, 这些对象的构造函数是在main函数调用之前就已经被调用了。因此在main函数 执行之前,内存中就已经存在着图1所示的链表就可以理解了。我们添加的rtti信息能否有效的支持对象的持久化可以由试验来验证。 2试验该试验主要验证了对象持久化必须具备的两个

7、能力,即动态创建对象能 力和获取对象所属类的能力。试验的环境如下:操作系统windows xpsp2, ide 环境是vc+6.0 sp6c如需要全部源代码可与作者联系(hehh6 )通过对象增加的rtti信息(增加的静态成员变量),获取对象所属类的 能力自然具备。动态创建对象能力实际上就是根据类的字符串名称来实例化对象的能 力,在图1所示链表的支持下,该功能可以非常轻松的实现。思路如下:通过classinfo : : pfirstclass查找类名匹配的classinfo,利 用classinfo中的pcreateobject指针实例化对象.3结束语本文在手动添加的rtti信息的支持下实现了对象的持久化,从中读者 可以深入了解对象持久化的的实现机制。在商业的编译器vc+中其实现持久化是通过一个神秘的宏,当将该宏展开后,vc+实现持久化的的思路和本文大同小异,只是更精巧4。参考文献:1 stanley b.lippman.inside the c+ object model (深度探索 c+对象模型)m. 侯捷,译武汉:华中科技大学岀版社,2001.2 葛磊.the object's permanence t

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

评论

0/150

提交评论