连续分配几个小的内存std::vectors?

Contiguous memory allocation for several small std::vectors?

我想找到一种方法来在连续的内存中存储多个 std::vectors,每个不同但已知且相当小的大小。我意识到我可以编写自己的 class,比如用一个非常大的数组,并在更大的数组中将指针指向数组的每个子部分的开头,将其视为一个单独的实体,但似乎应该有一个更聪明的这样做的方法。

有没有办法使用 allocators,例如,创建连续的 std::vectors?我不想重新发明轮子只是因为我想要这个正常的内存位置 std::vectors

我什至不知道如何开始编码。我需要创建一个分配器,它接受一个指向内存的指针,在那里分配一个向量,然后以某种方式传回该向量末尾的地址,因此下一个 std::vector 的分配器可以抓住它并再次执行. allocator return 怎么可能有值?

解决方案是@HowardHinnant 的short_alloc。我想在堆上进行分配,所以必须使用 new,*** 但 Howard 的 posted 代码完全符合我的要求。

template <std::size_t N>
class arena
{...
char* buf_ = new char[N] 
// still need to align this but not sure of the syntax 
// to do that with a new statement
...

当我问这个问题时,我认为缺少的部分是 allocators 可以有带参数的 constructors

constexpr int N = 1000*sizeof(int);
arena<N> myArena;
std::vector<int, short_alloc<int, N>> x(MyArena);

我在另一个 SO post 中找到了代码引用:Questions about Hinnant's stack allocator 引用自 CodeReview post Chris Drew 在他上面的评论中建议。谢谢大家

***代码确实在 allocate 方法中使用了 new,让我不确定这是否分配在堆栈上(从 buf_* 的声明中可以看出)或者在堆上(使用 new)...

根据您的要求,我将实现扩展 std::allocator 并覆盖从内存池中获取块的分配、解除分配方法的自定义分配器。如果您已经知道所需的最大大小,选择内存池大小应该不是问题。