【发布时间】:2015-06-06 10:02:57
【问题描述】:
这是我的应用程序的上下文:我正在开发一个使用来自不同设备的 RAM 的嵌入式系统。一部分在微控制器的内部 RAM (128kB) 中,另一部分是外部 RAM (1MB)。这些内存被映射到微控制器的地址空间,但在非连续区域中。
内部 RAM 用于系统堆栈、任务堆栈和堆。
外部 RAM 用于静态分配的数据(池、缓冲区和所有“static ...”的东西)
我正在尝试实现一个简单的内存管理结构,作为它的一部分,我能够创建一个分配器,它可以使用operator new 的分配算法,但使用另一个内存源,不是系统堆,而是其他地方的内存区域.你知道这是否可能吗?
一个使用示例可能是保留 100kB 的外部 RAM 并创建一个分配器来管理它,然后将其分配给需要此内存的指定任务。
static const uint8_t* ramBase = reinterpret_cast<uint8_t*>(0x80000000);
static const uint32_t ramAreaSize = 0x19000; //100kB
BufferAllocator allocator(ramBase, ramAreaSize);
//...
//Assuming operator new is overloaded to use BufferAllocator
MyObject * obj = new (allocator) MyObject(some, parameter);
//...
问题是:我如何(如果可能的话)实现BufferAllocator 以便使用operator new 来管理原始内存区域?
void* BufferAllocator::allocate(uint32_t bytes)
{
//I would like to write something like this
//and so let the responsibility to manage this memory area to "new"
//so I don't have to reimplement (or reuse) a different custom
// allocator
return ::operator new(ramBase, ramAreaSize, bytes)
}
【问题讨论】:
-
是的,这是可能的,这是正确的语法。不过,您不能只使用
delete来释放对象。另一种选择是重载operator new和operator delete只为您的MyObject类型,因此您不需要使用放置新语法。 -
这个问题:stackoverflow.com/questions/7194127/… 是开始阅读的好地方。
-
如果您要使用placement new,请使用
->~()进行删除。 -
我只是发现我的问题不是很清楚,所以我对其进行了编辑以添加一些细节:问题不是关于重载 operator new 以使用自定义分配器进行分配,而是关于
BufferAllocator使用已经为 operator new 实现的内存管理 -
基本上,您是在尝试在固定的内存区域上实现自己的堆。如果块分配器(所有块大小相同)可以 - 搜索它,这已经完成了很多次。
标签: c++ memory-management embedded