malloc像使用自定义堆的函数

如果我希望使用自定义预分配堆构建malloc类功能,那么C中最好的方法是什么?

我的具体问题是,我有一个已经放入我的地址空间的mmap-capable(类似于内存的)设备,但我需要获得更灵活的方式来使用这个内存来存储随着时间的推移将被分配和释放的对象。

我知道malloc,free和其他类似的函数被用来在堆上执行这种分配,但是有什么办法可以使用这种函数提供的逻辑来实现其动态行为,同时提供我自己的地址空间来作为有问题的堆?


Boost.Interprocess具有适用于共享内存段的有状态分配器:它们也可以重用于其他映射的地址范围。

否则,你可能需要推出自己的。 按照复杂性的顺序,您可以考虑:

  • 一个简单的竞技场分配器:这几乎是微不足道的,但无法释放单个对象并重新使用它们的内存
  • 一个简单的对象池分配器:这适用于几乎没有开销的固定大小的对象(假设对象至少与指针一样大,则可以维护一个单独链接的释放对象列表)
  • 一个具有多个不同大小对象池的混合系统(但每个池都是单独的一个简单的固定大小的实例)
  • 某种平板/竹节分配器(多个固定尺寸的池共享一个简单的大型固定尺寸板的底层分配器)
  • 一个SLOB分配器
  • 一个完整的malloc / free实现(其中有几个是开源的,所以你可以采取一个实现并将任何你不需要的东西剔除)。
  • 哪些是合适的将取决于你没有给出的一些信息:

  • 对象大小
  • 如果只有一个或只有几个大小的对象要分配,则对象池可以工作
  • 竞技场分配器不关心对象大小
  • 既不支持realloc
  • 对象生存期
  • 对象池通常支持任意的malloc / free序列
  • 竞技场通常只允许一次性全部释放(所以你只需将竞技场重置为空闲状态)。 你可以修改这个以允许LIFO释放。
  • 空间/性能折衷
  • 整个堆实现可能是最慢和最复杂的,但也是最灵活的
  • SLOB更轻松,重量更轻,但受碎片影响更大

  • malloc和family是一组相当复杂的库函数。 他们做了很多簿记,比如堆中的哪些部分正在使用等等。

    使用标准内存分配器malloc一个相对简单的方法是使用自定义映射重新映射默认堆。

    void * part_of_heap = memalign(sysconf(_SC_PAGESIZE), nbytes);
    void * ret = mmap(part_of_heap, nbytes
                 , PROT_READ | PROT_WRITE, MAP_FIXED, fd, 0);
    if (ret == MAP_FAILED) {/* ... */}
    free(part_of_heap);
    

    现在,放在malloc的part_of_heap - part_of_heap+nbytes中的任何内容都将进入您自己的映射区域。 尽管这不受支持,但并不保证任何分配将实际到达那里。

    否则,你需要实现你自己的内存分配器,它必须做记账。 链接列表将为初学者做。 我知道没有开放的实施可以满足您的需求。

    链接地址: http://www.djcxy.com/p/82529.html

    上一篇: malloc like function using custom heap

    下一篇: Array in C and malloc