1

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

4

3 回答 3

3

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

于 2013-08-14T14:12:59.833 回答
0

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

于 2013-08-15T06:50:59.327 回答
0

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

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

#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;
于 2013-08-14T14:05:47.307 回答