由于系统限制,假设我只能从堆中分配内存一次(例如使用std::allocator
或其他更通用的 C++11 兼容分配器)。
这种单一分配将占用很大的内存块。然后我想使用容器和动态内存,但都限于先前分配的内存块。
我设法编写了一个非常简单的分配器,它逐渐“提供”内存移动指针。在这个分配器deallocate
中是无操作的,并且来自块的内存不会返回到块。显然可以做得比这更好。换句话说,我想要一个托管堆。
按顺序重用此块内存是一个难题,因为需要管理不连续的空闲段、碎片整理、(可选)线程安全等。
这个图案叫什么名字?有一段时间我认为这是一个池分配器,但它似乎指的是其他东西(重用小对象)。
我可以使用 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
}