2

有没有办法在特定的内存位置(与系统堆分开)创建一个可用于动态内存分配的堆,但使用 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 库中,我不想浪费内存来复制它。

我正在使用带有 newlib(C 库)的 Sourcery Codebench Lite(GCC)。

4

2 回答 2

1

推出你自己的分配器并不是那么难,而且在很多方面都非常有指导意义。首先,您需要弄清楚要在该堆中支持哪种分配/解除分配模式。对于一般用途,类似于 dlmalloc (Doug Lea's) 的分配器非常好。具体用途还有很多:基于堆栈(其中一个空闲始终是最后分配的未释放内存块的地址)、基于固定大小(将内存按固定大小划分并返回)、基于队列、小块, ETC。

其中大多数也可以有一个内部分配器,例如假设你有一个固定大小的分配器,你可以告诉它分配 X 字节块(来自第二个分配器或系统),然后分成 Y 块字节。返回指向大小为 Y 字节的块的指针,但当没有空闲块时,您分配一个大小为 X 的新块并将其划分。

为方便起见,您还可以全局或在某些类上实现 new/delete 运算符,以将它们的分配重定向到您的自定义分配器。在你的堆上放置新的也很方便,见下文。

我个人更喜欢使用宏,因为它可以很容易地添加额外的调试信息(函数/行/等)。IE:

#define CUSTOM_NEW(Heap) new(Heap, __FUNCTION__, __LINE__)
int* ptr = CUSTOM_NEW(someHeap) int[32];
于 2012-11-03T22:41:04.753 回答
0

我终于看到了 Eli Bendersky 的博客,它准确地说明了我在寻找什么。 memmgr – 固定池内存分配器

于 2012-11-17T01:45:33.243 回答