为多个小的std::vectors进行连续内存分配?

8

我想找到一种方法将几个不同但已知且相对较小的大小的std::vectors存储在连续的内存中。我意识到我可以编写自己的类,例如,使用一个非常大的数组和指向该数组内每个子段开头的指针作为单独实体处理,但似乎应该有更聪明的方法来完成这个任务。

是否有一种方法可以使用分配器(allocators),例如创建连续的std::vectors?我不想因为想要这种内存局部性而重复造轮子。

我不知道如何开始编码。我需要创建一个分配器,它接受指向内存的指针,在那里分配一个向量,然后以某种方式返回该向量结尾的地址,这样下一个std::vector的分配器就可以获取并再次执行此操作。一个allocator怎么可能返回一个值呢?


2
是的,您可以使用分配器来完成这个任务。您尝试过什么?展示一下您的操作步骤吧 :) - Andrew
@Andrew 我在我的问题中添加了一些内容,但我不知道从哪里开始。我没有使用过分配器,到目前为止我所做的一切都是阅读Josuttis在STL参考书中的章节。 - sunny
1
有没有可能在编译时就知道大小? - Sergey Kalinichenko
8
如果大小在编译时保持不变且已知,您认为可以使用std::array<T,N>吗?这样更容易将它们放置在内存中,由于您没有增加向量的大小,所以不必要的成员函数(例如push_back(...))将被删除。当然,如果您使用的是C++11之前的版本,则无法使用此选项。 - Sergey Kalinichenko
1
请参见http://codereview.stackexchange.com/questions/31528/a-working-stack-allocator。 - Chris Drew
显示剩余7条评论
2个回答

1
解决方案是@HowardHinnant的short_alloc。我想在堆上分配,因此必须使用new,*** 但除此之外,Howard发布的代码完全符合我的要求。
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帖子中找到了代码参考:Hinnant堆栈分配器的问题,这个帖子是Chris Drew在他上面的评论中提到的CodeReview帖子引用的。谢谢大家。
*** 该代码在allocate方法中使用new,让我不确定这是在堆栈上分配的(从buf_*的声明中似乎是这样),还是在堆上分配的(使用new)...

0
针对您的需求,我会实现一个自定义分配器,它扩展了std::allocator并覆盖了allocate和deallocate方法,从内存池中获取块。如果您已经知道所需的最大大小,选择内存池大小不应该是一个问题。

是的,我同意,这就是我在原问题中提出的策略,但我没有清楚地说明如何使用分配器执行它。我下面发布的解决方案实现了我想要的功能。 - sunny
如果您想在堆栈上分配内存,请查看使用内置alloca函数获取内存。自定义分配器可以选择从哪里获取内存池。希望这有所帮助。由于此操作在堆栈上分配内存,因此在返回时会自动丢弃。 - kchoi

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接