我想将程序状态存储在文件中。因此,我有一个映射文件,可以对其进行操作,然后保存并在以后使用。
这对简单的事情很好,但是如果我想要一个需要动态内存分配的长寿命数据结构,则需要一个内存分配器,我可以强制在我映射的页面中进行分配。
我相当确定我无法使用标准的c malloc来做到这一点,而我已经看过了jemalloc,但我不知道在那里是否能看到任何东西。我不知道我的处理方法是否错误,但是有没有任何方法可以在使用堆之前指定堆的位置/大小?
答案 0 :(得分:6)
对于这样的事情,您实际上并不需要动态内存分配。您想要的是一个数组,该数组使用指向元素的索引值而不是实际的指针。
假设您要实现一个二叉树。您可以按以下方式对其进行建模:
struct tree {
int free;
int value;
int left;
int right;
};
left
和right
字段包含给定节点左侧和右侧的节点索引,值-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
来管理树的大小,或者将其保留在内存中。
如果您的数据结构包含任何类型的字符串,则需要结构包含固定大小的字符数组而不是指针,以便它们正确序列化。