是否有C或C++中的可克隆对象池实现

Any clonable object pool implementation in C or C++?

本文关键字:对象 实现 C++ 是否      更新时间:2023-10-16

这可能看起来很奇怪,但我会尝试将其合理化。我目前广泛使用boost.object_poolshared_ptr,最近我遇到了一种情况,我需要拍摄当前程序状态的快照,以便实现全面的重放/回滚/快进等功能。

因此,我并没有试图克隆一个对象池以在其他地方使用,这显然是行不通的,因为即使boost.pool的接口允许我这样做(我没有),在新克隆的池中也不会有指向块的有效指针,这也毫无意义。但我在这里的用例是,如果需要回放/回滚,我想">粘贴"它回到原始池中。

我当然可以复制和克隆所有状态、对象、子状态、子对象和子对象。。。手动将它们打包到快照中,希望一切顺利,但考虑到项目的复杂性,这很容易出错,而且速度肯定比直接复制内存慢得多。使用命令模式(或类似模式)来实现撤消重做也是不可能的,因为撤消重做机制不是我的本意。

我只是想知道,如果我再次使用顽固的传统C方式从头开始做这个项目,一个简单的memcpy(snapshot,all_states,size)调用几乎可以完成所有的工作。

我还有其他选择吗?是否有任何类似boost.object_pool的实现允许您克隆底层内存区域?考虑到目前的情况,入侵黑客boost.object_pool是一个合理的选择吗?

我不知道。

正如您所指出的,这里的主要问题是对象之间可能存在相互依赖关系,这需要在进行复制时更新指针。当然不是小事。

我能想到两种可能的解决方案:

  • 持久性
  • 序列化

持久性是指永远不会改变现有状态。当您更改状态时,您将创建一个新的快照,该快照引用除新位之外的旧状态。例如,它通常用于数据库的MVCC实现,并且在函数式编程世界中很普遍。如果你试图保留太多的引用,这也是一个很好的方法来获得空间泄漏。最后,它需要进行深入的重新设计。

序列化是关于持久化状态的,但格式不同。您可以以序列化格式(无论是文本还是二进制)转储当前状态,并且可以通过读取序列化缓冲区来重新创建它。您甚至可以对序列化缓冲区应用压缩传递来腾出一些内存。

既然您已经在使用Boost,那么很高兴了解到Boost.Serialization自动处理对象的图(嗯!),我认为已经正确处理了boost::shared_ptr。这可能是你最好的选择。