c++ - 在特定内存地址创建堆,用于动态内存分配

标签 c++ c embedded heap-memory dynamic-memory-allocation

有没有一种方法可以在特定的内存位置(与系统堆分开)创建一个可用于动态内存分配的堆,但要使用 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 库)。

最佳答案

推出您自己的分配器并不是那么困难,而且在很多方面都非常有启发性。 首先,您需要弄清楚您希望在该堆中支持哪种分配/ Release模式。对于一般用途,类似于 dlmalloc(Doug Lea 的)的分配器非常好。 针对特定用途还有更多种类:基于堆栈(其中空闲始终是最后分配的未释放内存块的地址)、基于固定大小(其中内存被划分为固定大小并返回)、基于队列、小块等

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

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

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

#define CUSTOM_NEW(Heap) new(Heap, __FUNCTION__, __LINE__)
int* ptr = CUSTOM_NEW(someHeap) int[32];

关于c++ - 在特定内存地址创建堆,用于动态内存分配,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/13210723/

相关文章:

c++ - 引用数据成员和 move 构造函数

c - 如何在应用程序(stm32f4 HAL)中更改SCB->VTOR?

c - fgetc() 无法读取 float

通过 SPI 使用 STM32F030R8 控制 AMIS-30543

linux - 在嵌入式设备上安装 ssh 服务器

c++ - 添加同名方法后继承的模板化方法不可见

c++ - : compare then change, 或立即更改哪个更快?

iphone - 当我尝试使用 b2Body 的功能时游戏崩溃了——为什么?

c - 双链表C编程中反向查看/搜索功能的问题

c - 简单 C - 提取变量的即时值并存储它