应该如何使用 Cap'n Proto 来实现应用程序的可变状态,类似于使用 Protobuf 的方式?有垃圾收集器吗?
Kenton Varda 在对 Cap'n Proto、FlatBuffers 和 SBE 的比较中证实,Cap'n Proto 在消息内部使用 arena 分配器。如果长时间编辑单个消息,例如由于写入磁盘并重新加载,则该消息将无限增长。
Cap'n Proto 是否有垃圾收集器来重新排列消息并回收任何浪费的空间?垃圾收集器是最佳方法吗?如果没有,或者不存在,那么推荐的方法是什么?
我实际上正在编写一个 Rust 程序,无论如何它都只能保存加密数据。因此,我可以重新复制整个消息结构,但我对更广泛的选项感到好奇。
回收浪费空间的唯一方法是将消息复制到新的 MessageBuilder 中。仅复制“已使用”的部分。这实际上就是“GC”——许多最好的 GC 算法实际上会移动数据,这就是您在这里要做的事情。
没有实用的方法来实现竞技场分配的 Cap'n Proto 消息的非移动 GC。
我正在考虑扩展 C++ 中的 Cap'n Proto 代码生成器,以生成一组适合表示堆上相同数据结构的类,以便您可以随着时间的推移修改该结构。当然,在堆表示和竞技场表示之间进行转换需要一个副本。但是,这还没有实施,我也没有任何时间表。(Rust 实现可能会得到类似的更新。)