gpt4 book ai didi

c++ - 我可以将一个内存池用于多个 vector 吗?

转载 作者:行者123 更新时间:2023-11-28 00:01:35 29 4
gpt4 key购买 nike

假设我有一个符合 STL 标准的分配器。我希望 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。

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

作为引用,我正在使用这个内存池实现:https://github.com/cacay/MemoryPool

最佳答案

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

A memory pool has just a few disadvantages:

  • Objects have a fixed size which must be known beforehand. This is usually not a problem and mostly the case if you need to allocate them in a bunch.

另见 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() 元素所需的单个连续 block 。因此它调用 allocate() 函数并将 n 设置为 capacity(),但是 MemoryPool 的工作方式就好像 n=1 被传入。MemoryPool 的实现甚至没有提供针对此类无效使用的保护(以断言的形式)。

关于c++ - 我可以将一个内存池用于多个 vector 吗?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/38555087/

29 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com