我可以为多个向量使用一个内存池吗?

时间:2016-07-24 18:00:33

标签: c++ memory-management stl

假设我有一个STL兼容(ish)分配器。我希望STL容器(std::vector)的多个实例(数百万)使用该分配器的相同实例(我们假设线程安全性得到保证)。这个实现会按预期工作吗?

MemoryPool<int> mypool;
std::vector<std::vector<int, MemoryPool<int>>> myvec;
myvec.assign(BIG_NUMBER, std::vector<int, MemoryPool<int>>{1, mydefault, mypool});

我也尝试过:

std::vector<std::vector<int, MemoryPool<int>>> myvec;
myvec.assign(BIG_NUMBER, {mydefault});

...并获得相同的内存使用量。

问题是我的内存使用情况正在爆炸。从默认分配器的~12MB到内存池分配器的~4GB。

我假设发生的事情是每个向量都获得了我的内存分配器的新实例,由于内存池的大块大小导致大量浪费的存储。我的理由是,如果它们都使用相同的内存池实例,则内存使用量将更接近默认分配器。

供参考,我使用此内存池实现:https://github.com/cacay/MemoryPool

1 个答案:

答案 0 :(得分:3)

您不能将MemoryPool用作std::vector的分配器,因为它适用于固定大小的分配:

  

内存池有一些缺点:

     
      
  • 对象具有固定大小,必须事先知道。这通常不是   如果你需要将它们分配成一堆,大多数情况都是如此。
  •   

另见comment above the declaration of the allocate() function

// Can only allocate one object at a time. n and hint are ignored
pointer allocate(size_type n = 1, const_pointer hint = 0);

std::vector不符合此约束,因为它将内存分配为适合至少capacity()个元素所需的单个连续块。因此,它将allocate()函数调用n设置为capacity(),但MemoryPool的工作方式就像传递了n=1一样。MemoryPool的实现甚至没有提供针对此类无效使用的保护(以断言的形式)。