我可以指定堆的位置来序列化我的数据吗?

前端之家收集整理的这篇文章主要介绍了我可以指定堆的位置来序列化我的数据吗?前端之家小编觉得挺不错的,现在分享给大家,也给大家做个参考。
我想将程序状态存储在文件中.所以我有一个mmapped文件,我执行操作,然后保存它,以后可能会使用它.

这对于简单的事情很好,但是如果我想要一个需要动态内存分配的长期数据结构,我需要一个内存分配器,我可以强制在我已映射的页面中分配.

我很确定我不能用标准的c malloc做这个,我看了jemalloc,我不知道我能不能看到任何东西.我不知道我是否采用了错误方法,但有没有办法在使用之前指定堆的位置/大小?

解决方法

对于这样的事情,你真的不想要动态内存分配.你想要的是一个数组,它使用指向元素的索引值而不是实际的指针.

假设您想要实现二叉树.你可以按如下方式建模:

struct tree {
    int free;
    int value;
    int left;
    int right;
};

左侧和右侧字段包含给定节点左侧和右侧节点的索引,值-1表示没有这样的节点(即,它等同于此上下文中的NULL指针).

free字段可用作标志,以确定数组的给定元素当前是否正在使用.如果节点标记为free等于1,则左侧字段指向下一个空闲节点,从而可以轻松找到空闲节点.

节点0的特殊之处在于它是空闲列表的开头,右侧字段指向树的根节点.

然后是以下树:

7
           /     \
          3      10
         / \     / \
        1   4   8   12

可以建模如下:

free  value   left  right
   ---------------------------
0  |  1  |   0   |  8  |  1  |
   ---------------------------
1  |  0  |   7   |  2  |  3  |
   ---------------------------
2  |  0  |   3   |  4  |  5  |
   ---------------------------
3  |  0  |   10  |  6  |  7  |
   ---------------------------
4  |  0  |   1   | -1  |  -1 |
   ---------------------------
5  |  0  |   4   | -1  |  -1 |
   ---------------------------
6  |  0  |   8   | -1  |  -1 |
   ---------------------------
7  |  0  |   12  | -1  |  -1 |
   ---------------------------
8  |  1  |   0   |  9  |  -1 |
   ---------------------------
9  |  1  |   0   | -1  |  -1 |
   ---------------------------

这样的树可以被memmap,或者使用malloc / realloc保存在内存中以管理大小.

如果您的数据结构包含任何类型的字符串,您将希望您的结构包含固定大小的字符数组而不是指针,以便它们正确序列化.

猜你在找的C&C++相关文章