我有一个非常复杂的数据结构,指向内存的各个部分。构建需要一段时间,我想将该结构使用的“内存”保存到磁盘。然后,当程序再次启动时,它将只是内存映射文件,我可以使用它。有没有办法做到这一点?
答案 0 :(得分:3)
boost :: serialization可以做到。注意:首先编写存档版本,然后执行register_types
答案 1 :(得分: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;
答案 2 :(得分:0)
您可以从Boost.Interprocess开始并使用内存maped文件。您的数据结构将看起来不同(指针是智能指针,引用被禁止,没有虚函数)。但它应该是可管理的。至少您使用的所有类型都需要在共享内存中构建。有些是(Boost.Container),有些则不是(Boost.Any,Boost.Variant)。