由于系统限制,假设我只能从一个堆分配一次内存(例如,使用std::allocator
或其他一些更通用的C ++ 11兼容分配器)。
此单个分配将占用一个大的内存块。 我想使用容器和动态内存,但都限于先前分配的内存块。
我设法编写了一个非常简单的分配器,该分配器逐渐“赋予”内存以移动指针。在此分配器中,deallocate
是空操作,并且块中的内存不会返回到块中。一个人显然可以做得更好。
换句话说,我想要一个托管堆。
按顺序重用此块内存是一个难题,因为需要管理不连续的自由段,碎片整理,(可选)线程安全性等。
此模式的名称是什么?一段时间以来,我虽然这是一个池分配器,但似乎引用了其他内容(重用小对象)。
我可以使用C ++的哪些功能或标准库来实现和管理这种分配,或者至少可以不费吹灰之力构建自己的C ++库?
我希望能在Boost中找到一些东西。 但是Boost.Pool是另外一回事,它看起来像是为Boost.Interprocess中的特定目的而实现的,但是它似乎并不易于使用,而且我很难理解它们的原型用途(例如进程间共享内存。)
否则,我找到的最接近的东西是https://www.boost.org/doc/libs/1_41_0/libs/pool/doc/interfaces/pool_alloc.html,但似乎::new
可以被多次调用。
示例代码:
int main(){
UserBlockAllocator<double> a(new double[1000], 1000);
{
std::vector<double, UserBlockAllocator<double>> v0(600, a);
} // v0 returns memory to block managed by a
std::vector<double, UserBlockAllocator<double>> v1(600, a);
std::vector<double, UserBlockAllocator<double>> v2(600, a); //out of memory
}
答案 0 :(得分:1)
此模式称为竞技场分配器或堆栈分配器。如果我正确理解std::pmr
的内容,则可以认为std::pmr::monotonic_buffer_resource
与之相关,但我从未尝试过。
使用这些关键字可以找到一些东西,但是我对这些工具没有经验。
请注意,很容易成功取消分配最新分配。
一种强大的模式是分配器的组成,如Andrei Alexandrescu在CppCon 2015上的一个有趣的演讲中所描述的。如果要构建自己的工具,则可以考虑将FreeListAllocator
({{3} }}放在StackAllocator
(43:18)的顶部。这样,您可以解决如何管理不连续的自由段(如您所述)的问题。