是否有办法在可用于动态内存分配的特定内存位置(与系统堆分开)创建堆,但使用内置于C库中的动态内存分配器。
我正在寻找与此功能相同的东西:
UserHeap heap(startAddress, size);
void* allocatedMemory1 = heap.Allocate(100); //Allocate 100 bytes.
void* allocatedMemory2 = heap.Allocate(200); //Allocate 200 bytes.
/* ... Do seomthing useful with the memory ... */
heap.Free(allocatedMemory1);
heap.Free(allocatedMemory2);
这uheap.h似乎有我正在寻找的东西,但这似乎并不存在于newlib中。我想知道GCC或newlib是否有某些东西。如果不是,我想我可能最终移植ptmalloc。但是,我的理解是这个代码已经存在于C库中了,我讨厌浪费再现它的记忆。
我使用Sourcery Codebench Lite(GCC)和newlib(C库)。
答案 0 :(得分:1)
推出自己的分配器并不是那么难,而且在很多方面都非常有启发性。 首先,您需要确定要在该堆中支持哪种分配/解除分配模式。对于一般用途,类似于dlmalloc(Doug Lea' s)的分配器非常好。 对于特定用法还有更多种类:基于堆栈(其中free是始终是最后分配的不同内存块的地址),基于固定大小(其中内存按固定大小划分,返回),基于队列,小块等等。
其中大多数也可以有一个内部分配器,例如假设你有一个固定大小的分配器,你可以告诉它分配X字节的块(来自第二个分配器或来自系统),然后分成Y字节块。返回大小为Y字节的块的指针,但是如果没有空闲块,则分配一个大小为X的新块并将其分开。
为方便起见,您还可以在全局或某些类上实现新的/删除操作符,以将其分配重定向到自定义分配器。 堆上新放置也很方便,见下文。
我个人更喜欢使用宏,因为它允许非常容易地添加额外的调试信息(函数/行/等)。即:
#define CUSTOM_NEW(Heap) new(Heap, __FUNCTION__, __LINE__)
int* ptr = CUSTOM_NEW(someHeap) int[32];
答案 1 :(得分:0)
我终于遇到了Eli Bendersky的一篇博客,它正好说明了我在寻找什么。 memmgr – a fixed-pool memory allocator