将数据结构 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 ,打开指定数据库,执行插入操作后会啥会写到磁盘?不是对内存进行操作吗?