为具有固定大小数组的对象预分配内存池

Preallocated memory pool for objects with fixed-sized array

我有一个具有以下结构的类型:

class Block
{
   /* few fixed size fields*/
   ...

   /* fixed size byte array*/
   std::unique_ptr<std::uint8_t[]> data;
}

这些对象用于工作流水线中,并且会有很多这样的对象。 data 的大小是一个运行时参数,但它在工作开始前就已知,以后不会更改。

我想使用一个内存池(特别是 boost::pool/boost::object_pool)来预分配很多这样的对象,每个 Block 对象的布局后面是 data 数组。

我怎样才能做到这一点?

我认为您唯一的选择是在 boost::pool 之上编写自定义分配器并使用它来获取指向内存的指针。您可以通过查看 How to use boost::pool library to create a custom memory allocator 编写这样的分配器来开始。

基本上这个自定义分配器将分配一大堆内存(至少一个)并返回指向块和数据的指针boost::pool。修改前面 post 的第一个答案,使其不依赖于 T 的大小,而是依赖于作为参数传递的自定义大小。这个大小应该是 sizeof(Block) + data_length.

现在,您可以做的是作弊并改变您的class:

class Block
{
    uint8_t* data;
};

现在,当您请求一个新的 Block 时,您不仅会得到您的 Block,之后还会得到数据块。当你构造你的对象(新的放置)时,还传递指向新数据的指针(这将是 allocator + sizeof(Block) 的 return。

释放数据后,不要忘记先调用析构函数,因为这是放置新文件所必需的。

当然,还有很多小细节需要您解决,但这应该给您一个开始。