是否有C或C++中的可克隆对象池实现
Any clonable object pool implementation in C or C++?
这可能看起来很奇怪,但我会尝试将其合理化。我目前广泛使用boost.object_pool和shared_ptr,最近我遇到了一种情况,我需要拍摄当前程序状态的快照,以便实现全面的重放/回滚/快进等功能。
因此,我并没有试图克隆一个对象池以在其他地方使用,这显然是行不通的,因为即使boost.pool的接口允许我这样做(我没有),在新克隆的池中也不会有指向块的有效指针,这也毫无意义。但我在这里的用例是,如果需要回放/回滚,我想">粘贴"它回到原始池中。
我当然可以复制和克隆所有状态、对象、子状态、子对象和子对象。。。手动将它们打包到快照中,希望一切顺利,但考虑到项目的复杂性,这很容易出错,而且速度肯定比直接复制内存慢得多。使用命令模式(或类似模式)来实现撤消重做也是不可能的,因为撤消重做机制不是我的本意。
我只是想知道,如果我再次使用顽固的传统C方式从头开始做这个项目,一个简单的memcpy(snapshot,all_states,size)调用几乎可以完成所有的工作。
我还有其他选择吗?是否有任何类似boost.object_pool的实现允许您克隆底层内存区域?考虑到目前的情况,入侵黑客boost.object_pool是一个合理的选择吗?
我不知道。
正如您所指出的,这里的主要问题是对象之间可能存在相互依赖关系,这需要在进行复制时更新指针。当然不是小事。
我能想到两种可能的解决方案:
- 持久性
- 序列化
持久性是指永远不会改变现有状态。当您更改状态时,您将创建一个新的快照,该快照引用除新位之外的旧状态。例如,它通常用于数据库的MVCC实现,并且在函数式编程世界中很普遍。如果你试图保留太多的引用,这也是一个很好的方法来获得空间泄漏。最后,它需要进行深入的重新设计。
序列化是关于持久化状态的,但格式不同。您可以以序列化格式(无论是文本还是二进制)转储当前状态,并且可以通过读取序列化缓冲区来重新创建它。您甚至可以对序列化缓冲区应用压缩传递来腾出一些内存。
既然您已经在使用Boost,那么很高兴了解到Boost.Serialization
自动处理对象的图(嗯!),我认为已经正确处理了boost::shared_ptr
。这可能是你最好的选择。
- 如何实现自定义匹配器以检查 Catch2 中的对象相等性
- 我能否通过将函数实现为类对象方法来避免使用互斥锁
- 为什么地图需要实现'operator<'以及如何比较对象?
- CMake + Qt,moc 编译失败,无法实现 QMetaObject 方法(编译器找不到基本 ui 对象的标头?
- C++接口实现和子类化对象识别
- 对象内部有大量数据容器,实现更高效的对象交换
- 使用初始值设定项列表作为函数参数的类对象实现运算符 [] 的示例
- 可选<double>可以作为 8 字节对象实现吗?
- 我们可以在同一对象中实现多个QtRO接口吗?
- 如何在V8中为C 本机对象实现属性枚举器
- 我真的需要为常量对象实现用户提供的构造函数吗?
- C++对象 [实现] 运算符 == 错误
- 使用指针和使用静态对象实现单例实现之间的区别
- 为具有内部指针的对象实现swap()
- 对象实现后动态绑定大多数不相关的对象
- 此同步对象实现线程是否安全
- 如何在c++中为每个对象实现定时器
- 预序列化消息对象-实现
- 使用ADO命令对象实现批量/批量插入
- 用抽象基类重用对象实现多态