1

我想知道哪些是保存和加载 C++ 数据的最佳方式。我最感兴趣的是保存我在模拟中使用的类和矩阵(不是稀疏的)。现在我只是将它们保存为 txt 文件,但是如果我将一个成员添加到一个类中,我必须修改加载数据的函数(它必须解析并检查 txt 文件中的值),我认为不是理想的。

你一般会推荐什么?(ps 因为我想发布我的代码,所以我真的很想只使用标准 c++ 或可以重新分发的库)。

4

3 回答 3

1

在这种情况下,没有“最好”。最适合您的方法在很大程度上取决于您的情况。但是,让我们举一个例子来让你思考你的细节以及这个兔子洞可以有多深。

如果您绝对肯定必须毫无疑问地尽可能快地保存(并且您愿意付出代价),您可以定义自己的内存管理,将所有对象放入一个常见类型(例如整数)的连续数组中。这使您可以非常快速地将该数组作为二进制数据写入磁盘。您可能需要在模拟中有效地使用线程来加载每个核心/处理器以实时运行。

为什么是一个相当可怕的解决方案?因为它需要大量的工作并且以“优化”的名义冒着许多问题的风险。

  1. 它要求您构建自己的内存管理(运算符 new() 和运算符 delete()),这可能需要线程安全。
  2. 如果您尝试从该数组加载,则必须使用唯一的非修改构造函数放置新的所有对象,以确保正确设置所有虚拟指针。哦,你必须跟踪每个地址的类型到现在如何做到这一点。
  3. 为了与其他系统和二进制版本之间的可移植性,您需要使用实用程序将二进制格式转换为足以跨平台的通用格式(包括重新填充指向其他对象的指针)。

我已经做到了。这是非常不愉快的。我毫不怀疑它仍然存在问题,我在这里只列出了一些。但是,它非常、非常快,而且非常、非常、非常有问题。

您必须根据自己的需要进行设计。通常,第一个需求是“让它发挥作用”。不关心效率,只关心准确持续的事情,并且您在某个时候拥有已知和可访问的信息来执行此操作。此外,您应该封装保存和加载的过程。然后,如果需要“让它变得更好”,您应该能够更改那一点代码,其余的应该可以工作。您甚至可以根据用户需要选择保存格式,而不是您必须为所有用户假设的需要。

鉴于列出的所有假设、优点和缺点,您应该能够详细说明您对这个问题的特殊需求。

于 2012-09-16T14:27:17.323 回答
0

鉴于性能不是您关心的问题——这是答案的关键部分——Boost Serialization 库是一个很好的答案。

评论中的链接指向文档。阅读教程(这对于您最初想要的东西来说有点过分了,但非常值得)。

最后,由于您主要使用数组矩阵,因此请尝试封装保存和加载的整个过程,以便以后需要更改它,您正在编写一个新的实现并在现有的实现中进行选择。我将 eddedmtime 用于 Boost 序列化的智能不会很好;但是,您可能会发现未来的需求使您转向其他事物或多个其他事物。

于 2012-09-17T13:59:24.220 回答
0

C++ 中间件编写器自动创建编组函数。当您将成员添加到类时,它会为您更新编组功能。

于 2012-09-17T15:18:01.100 回答