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

时间:2018-10-19 15:34:57

标签: c memory memory-management dynamic-memory-allocation

我想将程序状态存储在文件中。因此,我有一个映射文件,可以对其进行操作,然后保存并在以后使用。

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

我相当确定我无法使用标准的c malloc来做到这一点,而我已经看过了jemalloc,但我不知道在那里是否能看到任何东西。我不知道我的处理方法是否错误,但是有没有任何方法可以在使用堆之前指定堆的位置/大小?

1 个答案:

答案 0 :(得分:6)

对于这样的事情,您实际上并不需要动态内存分配。您想要的是一个数组,该数组使用指向元素的索引值而不是实际的指针。

假设您要实现一个二叉树。您可以按以下方式对其进行建模:

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

leftright字段包含给定节点左侧和右侧的节点索引,值-1表示没有此类节点(即,等效于a在这种情况下为NULL指针。

free字段可用作标志,以确定当前是否正在使用数组的给定元素。如果某个节点被标记为free等于1,则left字段指向下一个空闲节点,因此很容易找到空闲节点。

节点0的特殊之处在于它是空闲列表的开始,right字段指向树的根节点。

然后是以下树:

              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 |
   ---------------------------

可以使用malloc / realloc来管理树的大小,或者将其保留在内存中。

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