C++永久对象存储 (Persistent Object Storage for C++)
简介 描述对象类型 从存储器中分配和释放对象 永久对象协议 存储器构造函数 打开存储器 POST++ 的安装 POST++ 类库 和 POST++一起使用 STL 类 替换标准分配子 如何使用 POST++ S调试 POST++ 应用的细节 关于 POST++ 更多的一些信息 简介 POST++ 提供了对应用对象的简单有效的存储. POST++ 基于内存文件镜像机制和页面镜像处理。POST++ 消除了对永久对象访问的开销. 此外 POST++ 支持多存储,虚函数, 数据更新原子操作, 高效的内存分配和为指定释放内存方式下可选的垃圾收集器. POST++ 同样可以很好的工作在多继承和包含指针的对象上。
描述对象类型 POST++ 存储管理需要一些信息以使永久对象类型支持垃圾收集器,装载时引用重定位和初始化虚表内函数指针。但不幸的是C++语言没有提供运行时从类中或许这些信息的机制。为了避免使用一些特殊的工具(预处理器)或“脏哄骗”途径(从调试信息中获取类信息),这些信息必须由程序员来指明。这些称为类注册器的东西可以简单的通过POST++提供的一些宏来实现。
POST++ 在从存储器重载入对象时调用缺省构造函数来初始化对象。为了使对象句柄能够存储,程序员必须在类定义中包含宏 CLASSINFO(NAME, FIELD_LIST) . NAME 指明对象的名字。 FIELD_LIST 描述类的的引用字段。在头文件 classinfo.h 定义了三个宏用于描述字段: REF(x) 描述一个字段. REFS(x) 描述一个一维固定数组字段。. (例如:定长数组). VREFS(x) 描述可变一维数组字段。可变数组只能是类的最后一个成员。当你定义类的时候,你可以指定一个仅包含一个元素的数组。具体对象实例中的元素个数可以在生成时指定。 这些宏列表必须用空格分开: REF(a) REF(b) REFS(c). 宏 CLASSINFO 定义了缺省构造函数 (没有参数的构造函数) 和类描述符. 类描述符是类的一个静态成员名为 self_class. 这样类 foo 的描述符可以通过 foo::self_class 访问. 基类和成员的缺省构造函数会被编译器自动调用,你不必担心需要明确调用他们。但是对于序列化的类中的结构成员不要忘记在结构定义中使用 CLASSINFO 宏。然后通过存储器管理注册该类使其可被访问。这个过程由宏 REGISTER(NAME) 完成。类名将和对象一起放在存储器中。在打开存储器的时候类在存储和应用程序之间被镜像。存储器中的类名和程序中的类名进行比较。如果有类没有被程序定义或应用程序和存储器中的类有不同的大小,程序断言将失败。
下面的例子阐述了这些规则:
struct branch { object* obj; int key; CLASSINFO(branch, REF(obj));};class foo : public object { protected: foo* next; foo* prev; object* arr[10]; branch branches[8]; int x; int y; object* childs[1]; public: CLASSINFO(foo, REF(next) REF(prev) REFS(arr) VREFS(linked)); foo(int x, int y);};REGISTER(1, foo);main() { storage my_storage("foo.odb"); if (my_storage.open()) { my_root_class* root = (my_root_class*)my_storage.get_root_object(); if (root == NULL) { root = new_in(my_storage, my_root)("some parameters for root"); } ... int n_childs = ...; size_t varying_size = (n_childs-1)*sizeof(object*); // We should subtract 1 from n_childs, because one element is already // present in fixed part of class. foo* fp = new (foo:self_class, my_storage, varying_size) foo(x, y); ... my_storage.close(); } }
从存储器中分配和释放对象 POST++ 为了管理存储内存提供了特别的内存分配子. 这个分配子使用两种不同的方法: 针对分配小对象和大对象。所有的存储内存被划分为页面(页面的大小和操作系统的页面大小无关,目前版本的 POST++ 中采用了 512 字节). 小对象是这样一些对象,他们的大小小于或等于256字节(页面大小/2). 这些对象被分配成固定大小的块链接起来。
上一篇:Borland C++ Builder 5 企业版使用BDE访问 Oracle方法
下一篇:ORACLE控制文件的重建
|