将数据结构 c++ 保存到磁盘

Posted

技术标签:

【中文标题】将数据结构 c++ 保存到磁盘【英文标题】:saving data structure c++ to disk 【发布时间】:2013-08-14 13:58:43 【问题描述】:

我有一个非常复杂的数据结构,其中包含指向内存各个部分的指针。构建需要一段时间,我想将该结构使用的“内存”保存到磁盘。然后,当程序再次启动时,它只会对文件进行内存映射,我可以使用它。有没有办法做到这一点?

【问题讨论】:

是的,只需遍历您的结构并复制字节数组即可。如果它是一个指针,只需访问指针指向的数据并复制它。举一个结构的例子,我会更深入。 你能展示你的数据结构吗? 发布一个简化版的类,比如说,两个指向其他东西的指针和几个简单的数据成员,我们将向您展示如何编写和阅读它。 如果您的对象使用指针,您不能只保存它们的值。下次程序运行时,不能保证指向的对象将位于相同的内存位置。您还需要保存所有指向的内容。 boost::serialization ? 【参考方案1】:

boost::serialization 可以做到。注意:先写存档版本再做register_types

【讨论】:

我试过了,但它说我需要一个 serialize() 方法。对吗? 但是我怎么写这样的方法呢?我在网上看到了一些例子,但是这些例子都是非常简单的结构而不是复杂的指针结构。【参考方案2】:

可以,是的,但是您需要了解结构实际上是如何存储在内存中的,以及它在各种平台上的变化(对齐、打包、字节排序、原始类型大小等)。此外,将“指向各个部分的指针”更改为“各个部分的偏移量”是谨慎的做法,因为实际内存位置会在进程使用之间发生变化。

例如,将这样的对象写入磁盘应该是相当可移植的:

#pragma pack(1)
typedef struct 
   unsigned char data8[8];
   unsigned char data4[4];
   unsigned char offset[2];
   unsigned char data2[2];
 MyStruct;
#pragma pack() // to return to default

但是这样的问题会很严重:

typedef struct _MyStruct 
   unsigned long long data8;
   unsigned int data4;
   struct _MyStruct *nextOne;
   unsigned short data2;
 MyStruct;

【讨论】:

【参考方案3】:

您可以从Boost.Interprocess 开始并使用内存映射文件。你的数据结构看起来有点不同(指针是智能指针,禁止引用,没有虚函数)。但它应该是可控的。至少您使用的所有类型都需要在共享内存中可构造。有些是(Boost.Container)有些不是(Boost.Any,Boost.Variant)。

【讨论】:

以上是关于将数据结构 c++ 保存到磁盘的主要内容,如果未能解决你的问题,请参考以下文章

在 Visual Studio 中调试时,我可以将一些 C/C++ 结构内容保存到磁盘吗?

C++ 使用 SQLite3 ,打开指定数据库,执行插入操作后会啥会写到磁盘?不是对内存进行操作吗?

最佳核心数据保存策略(何时将数据保存到磁盘)

将数据帧保存到磁盘会丢失 numpy 数据类型

如何在 Matlab 中训练模型,将其保存到磁盘并加载到 C++ 程序中?

hsqldb 不将数据写入或保存到磁盘