管理单个内存块的分配器

时间:2018-08-11 09:10:12

标签: c++11 boost memory-management allocator memory-pool

由于系统限制,假设我只能从一个堆分配一次内存(例如,使用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
}

1 个答案:

答案 0 :(得分:1)

此模式称为竞技场分配器堆栈分配器。如果我正确理解std::pmr的内容,则可以认为std::pmr::monotonic_buffer_resource与之相关,但我从未尝试过。

使用这些关键字可以找到一些东西,但是我对这些工具没有经验。

请注意,很容易成功取消分配最新分配。

一种强大的模式是分配器的组成,如Andrei Alexandrescu在CppCon 2015上的一个有趣的演讲中所描述的。如果要构建自己的工具,则可以考虑将FreeListAllocator({{3} }}放在StackAllocator43:18)的顶部。这样,您可以解决如何管理不连续的自由段(如您所述)的问题。