malloc像使用自定义堆的函数

如果我想用自定义的预分配堆构buildmalloc类似的function,C中最好的方法是什么?

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

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

Solutions Collecting From Web of "malloc像使用自定义堆的函数"

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

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

  1. 一个简单的竞技场分配器:这几乎是微不足道的,但没有办法释放单个对象并重新使用它们的内存
  2. 一个简单的对象池分配器:这对几乎没有开销的固定大小的对象起作用(假设对象至少和指针一样大,可以维护一个单独链接的释放对象列表)
  3. 一个具有多个不同大小的对象池的混合系统(但是每个池都是一个简单的固定大小的实例)
  4. 某种平板/竹节分配器(多个固定尺寸的池共享一个简单的大型固定尺寸板的底层分配器)
  5. 一个SLOB分配器
  6. 一个完整的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_heappart_of_heap+nbytes的东西都会进入你自己的映射区域。 这是不受支持的,但不能保证任何分配将实际到达那里。

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