假设我有一个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
答案 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
的实现甚至没有提供针对此类无效使用的保护(以断言的形式)。