有时需要在文件中存储链接对象的集合以供将来使用。在这方面,有两种最明显的方法,这两种方法似乎都不太令人满意。第一种方法是创建指向文件偏移的指针映射,如下所示:
struct A
{
int data;
std::list<B*> links;
};
struct B
{
char data;
std::list<C*> links;
};
typedef unsigned Offset;
std::map<void*,Offset> ptr2ofs;
这种方法的问题在于它需要额外的映射,可以进行散列以便更快地访问,但总体上会为每个保存的链接引入时间和空间开销。
第二种方法是将偏移字段直接包含在数据结构中:
struct A
{
int data;
Offset offset;
std::list<B*> links;
};
这使得写入操作更快,但保存后偏移字段变为冗余,并且在加载后将产生内存开销。因此,在这种情况下,将需要两组结构,一组用于保存数据,另一组用于加载它:
struct A_write
{
int data;
Offset offset;
std::list<B*> links;
};
struct A_read
{
int data;
std::list<B*> links;
};
因此,这两种方法显然都有明显的缺点,也不能被视为参考方法。但有没有办法改善它们?
答案 0 :(得分:0)
有没有听说过offset pointers?它们存储相对地址而不是绝对地址,因此如果您只是想将一块内存插入文件并在另一天将其读回内存,则所有地址引用仍然有效。
如果您想使用序列化库,请查看以下内容之一。是的,你可以自己设计它,但是有人已经经历过这个麻烦......