我的类型具有以下结构:
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} }数组。
我该如何实现?
答案 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)
的返回。
释放数据后,别忘了先调用析构函数,因为这是放置新对象所必需的。
当然,您仍然需要解决许多小细节,但这应该为您提供一个开始。