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

Can I specify the location of the heap to serialize my data?

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

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

我相当确定我不能用标准的 c malloc 来做到这一点,我已经看过 jemalloc,但我不知道我是否能在那里看到任何东西。我不知道我这样做是否走错了路,但是有没有 any 方法在使用堆之前指定堆的 location/size?

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

假设你想实现一个二叉树。您可以按如下方式对其建模:

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

leftright字段包含给定节点左右节点的索引,值为-1表示没有该节点(即等价指向此上下文中的 NULL 指针)。

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

0号节点比较特殊,它是free list的开始,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 来管理大小。

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