|
| |
精品推荐 |
 |
|
| |
|
|
|
|
C++永久对象存储 (Persistent Object Storage for C++)
|
日期:2007年7月2日 作者: 查看:[大字体
中字体 小字体]
|
替换标准分配子 在前面一节中我解释了如何和 STL 库一起使用 POST++。但是仍然有很多其他你想用的C++和C库以及应用,而且没有提供象 STL 这种易通融的分配机制。在这种情况下唯一可能的解决方案(如果你不想改变此库的任何源代码的话)就是用一个 POST++ 提供的来替换标准的分配机制。这样任何动态分配对象都从 POST++ 存储器中分配(除了一个不能在这种情况下使用的存储器)。
POST++ 发行包中包含的文件 postnew.cxx 重定义了标准的 malloc,free,realloc 和 calloc 函数。当打开存储器时,所有的对象被在存储器中分配。否则 sbrk() 函数被用来分配对象(为这些对象分配的空间没有回收)。可能不需要接触这些标准C分配函数而仅需重载缺省的C++操作符 new 和 delete。当编译 postnew.cxx 时定义 DO_NOT_REDEFINE_MALLOC 宏来这么做。从 postnew.cxx 生成的目标文件必须在标准C库前传递给链接程序。
作为一个 POST++ 这样使用的例子可以参见 testnew.cxx 和 testqt.cxx。第一个举例说明了标准C++数组如何持久化。第二个举例说明了POST++如何和Qt类库一起工作。
就 POST++ 没有关于存储类的格式信息这里有一些限制在 POST++ 的使用上:
包含虚函数的类不被支持(POST++ 不能正确的初始化到虚函数表的指针)。 隐式内存释放(垃圾收集器)是不可能的 - POST++ 没有关于对象内部指针位置的信息。 存储器必须总映射到相同的虚拟地址上因为如果基地址改变了 POST++ 不能调整指针。 如果所有这些限制不是你的应用所必需的,你可以使其持久化而不需要任何代码的改动。这个方法在C和C++程序中都可以使用。
如何使用 POST++ 这里有几个 POST++ 类和应用的例子。其中最简单的就是游戏“猜动物”。这个游戏的算法非常简单并且结果看起来给人以深刻的印象(有些象人工智能)。此外这个游戏是一个非常好的例子,阐明了持久对象存储的好处。这个游戏的源代码在文件 guess.cxx 中。创建这个游戏包含在缺省的make目标中。执行guess来运行它。
Unix specific: 当你准备和 POST++ 库链接你的Unix应用并且持久对象中波阿含虚函数,请不要忘记重编译 comptime.cxx 文件并包含在链接列表中。这个文件是必须的用于 POST++ 提供可执行文件的时间戳,被放在存储器中用来判定什么时候应用被改变并在需要的时候重新初始化对象内的虚函数表。Attention! 这个文件必须在你每次重新链接你的应用时被重新编译。我建议你让编译器为你调用链接程序并包含 comptime.cxx 源文件在为运行映像目标文件提供的对象文件列表中(see makefile)。
调试 POST++ 应用的细节 这一节的内容对使用了事务的应用是非常有意义的。POST++ 使用页面保护机制来提供当源页面修改时生成影子页面,当存储器打开或事务提交时所有文件页面的映像是只读保护的。所以任何试图修改分配在这些页面里对象的内容将导致一个访问违例异常。这个异常被指定的 POST++ 句柄处理。但是如果你使用调试器,它将首先捕获这个异常并停止应用程序。如果你想调试你的应用你必须作一些准备: 在 Unix 可以充分的告诉调试器不要捕获 SIGSEGV 信号。比如对于 GDB 它可以通过命令来完成:handle SIGSEGV nostop noprint pass。如果 SIGSEGV 信号不是由存储页面保护违例产生,但是是程序中的一个错误,POST++ 异常处理程序将“理解”它不是自己的异常并送出一个 SIGABRT 信号到己进程中,这可以被调试器捕获。 在 Windows POST++ 使用不处理异常过滤器来( Unhandled Exception Filter )处理存储器页面保护违例。不幸的是不可能让 Microsoft Debugger 忽略不处理异常。如果你准备调试你的应用,你必须把所有你的程序代码(main 或者 WinMain 函数)封装为结构化的异常阻塞。你必须在 Borland C++ 中总使用结构化异常处理,因为 Unhandled Exception Filter 没有在Borland中被正确调用。请使用两个宏 SEN_TRY 和 SEN_ACCESS_VIOLATION_HANDLER() 来封装 main(或 WinMain)的函数体: main() { SEN_TRY { ... } SEN_ACCESS_VIOLATION_HANDLER(); return 0; }
请确定调试器对此异常的行为是“如果没有处理就停止”而不是“总是停止”(你可以在 Debug/Exceptions 菜单中检查它)。在文件 testrans.cxx 中你可以发现使用结构化异常处理的例子。 关于 POST++ 的更多的一些信息 POST++ 是 freeware。开发出她希望是有用的。通过她你可以做任何你想做的(在开发产品中使用 POST++ 没有任何限制)。我将很高兴来帮助你使用 POST++ 和得到关于 POST++ 任何类型的信息(错误报告,建议...)。POST++ 的免费软件情形并不意味着缺少支持。我保证将努力修正任何报告的错误。
上一篇:ORACLE使用LogMiner分析重做日志文件全部步骤(WINDOWS NT CHINESE VERSION)
下一篇:Oracle8i基于规则的优化机制对表达式的处理
|
| 相关文章: |
|
|
|
| 相关软件: |
|
| |
|