我想将程序状态存储在文件中.所以我有一个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保存在内存中以管理大小.
如果您的数据结构包含任何类型的字符串,您将希望您的结构包含固定大小的字符数组而不是指针,以便它们正确序列化.