从C ++模拟中保存和加载数据的有效方法

时间:2012-09-16 08:59:10

标签: c++ save

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

一般情况下你会推荐什么? (p.s.因为我想发布我的代码我真的只想使用标准的c ++或可以重新分发的库)。

3 个答案:

答案 0 :(得分:1)

在这种情况下,没有“最好的”。最适合你的是高度依赖你的情况。但是,让我们举一个例子让你思考你的细节以及这个兔子洞的深度。

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

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

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

    您必须根据自己的需要进行设计。通常,首要的需求是“让它工作”。不关心效率,只关心准确持续存在的事情,以及您在某些时候知道并可访问的信息。此外,您应该封装保存和加载的过程。然后,如果需要“让它更好”的步骤,你应该能够改变那一段代码,其余的应该工作。您甚至可以根据用户需求选择保存格式,而不是您必须为所有用户承担的需求。

    鉴于列出的所有假设,利弊,您应该能够详细说明您对此问题的特殊需求。

答案 1 :(得分:0)

鉴于性能不是您的关注 - 这是答案的关键部分 - Boost序列化库是一个很好的答案。

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

最后,由于您主要使用数组矩阵,因此请尝试封装整个保存和加载过程,以便以后需要更改它时,您正在编写新的实现并在现有选择之间进行选择。我为了Boost Serialization的智能而花费了eddedmtime并不是很好;但是,您可能会发现未来的要求会将您转移到其他地方或多个地方。

答案 2 :(得分:0)

C++ Middleware Writer自动创建编组功能。将成员添加到类时,它会为您更新编组功能。