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

时间:2018-12-12 14:17:15

标签: c++ memory pool

我的类型具有以下结构:

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

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

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

我想使用一个内存池(特别是boost :: pool / boost :: object_pool)以这样的布局预分配很多这样的对象:每个Block对象后面紧跟着{{1} }数组。

我该如何实现?

1 个答案:

答案 0 :(得分:2)

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

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

现在,您可以要做的就是作弊并改变班级:

class Block
{
    uint8_t* data;
};

现在,当您要求一个新的Block时,您不仅得到Block,而且还获得了数据块。构造对象(放置新对象)时,还要将指针传递给新数据(这将是allocator + sizeof(Block)的返回。

释放数据后,别忘了先调用析构函数,因为这是放置新对象所必需的。

当然,您仍然需要解决许多小细节,但这应该为您提供一个开始。