我想知道哪些是保存和加载 C++ 数据的最佳方式。我最感兴趣的是保存我在模拟中使用的类和矩阵(不是稀疏的)。现在我只是将它们保存为 txt 文件,但是如果我将一个成员添加到一个类中,我必须修改加载数据的函数(它必须解析并检查 txt 文件中的值),我认为不是理想的。
你一般会推荐什么?(ps 因为我想发布我的代码,所以我真的很想只使用标准 c++ 或可以重新分发的库)。
在这种情况下,没有“最好”。最适合您的方法在很大程度上取决于您的情况。但是,让我们举一个例子来让你思考你的细节以及这个兔子洞可以有多深。
如果您绝对肯定必须毫无疑问地尽可能快地保存(并且您愿意付出代价),您可以定义自己的内存管理,将所有对象放入一个常见类型(例如整数)的连续数组中。这使您可以非常快速地将该数组作为二进制数据写入磁盘。您可能需要在模拟中有效地使用线程来加载每个核心/处理器以实时运行。
为什么是一个相当可怕的解决方案?因为它需要大量的工作并且以“优化”的名义冒着许多问题的风险。
我已经做到了。这是非常不愉快的。我毫不怀疑它仍然存在问题,我在这里只列出了一些。但是,它非常、非常快,而且非常、非常、非常有问题。
您必须根据自己的需要进行设计。通常,第一个需求是“让它发挥作用”。不关心效率,只关心准确持续的事情,并且您在某个时候拥有已知和可访问的信息来执行此操作。此外,您应该封装保存和加载的过程。然后,如果需要“让它变得更好”,您应该能够更改那一点代码,其余的应该可以工作。您甚至可以根据用户需要选择保存格式,而不是您必须为所有用户假设的需要。
鉴于列出的所有假设、优点和缺点,您应该能够详细说明您对这个问题的特殊需求。
鉴于性能不是您关心的问题——这是答案的关键部分——Boost Serialization 库是一个很好的答案。
评论中的链接指向文档。阅读教程(这对于您最初想要的东西来说有点过分了,但非常值得)。
最后,由于您主要使用数组矩阵,因此请尝试封装保存和加载的整个过程,以便以后需要更改它,您正在编写一个新的实现并在现有的实现中进行选择。我将 eddedmtime 用于 Boost 序列化的智能不会很好;但是,您可能会发现未来的需求使您转向其他事物或多个其他事物。
C++ 中间件编写器自动创建编组函数。当您将成员添加到类时,它会为您更新编组功能。