[英]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之上编写一个自定义分配器,并使用它来获取指向内存的指针。 您可以首先看一下如何使用boost :: pool库来创建用于编写这种分配器的自定义内存分配器。
基本上,此自定义分配器将分配一大堆内存(至少一个),并使用boost :: pool返回指向块和数据的指针。 修改上一篇文章的第一个答案,使其不依赖于T的大小,而是依赖于作为参数表传递的自定义大小。 此大小应为sizeof(Block) + data_length
。
现在,您可以做的是作弊并更改课程:
class Block
{
uint8_t* data;
};
现在,当您请求一个新的Block
,您不仅得到了Block
,还随后得到了数据块。 构造对象(放置新对象)时,还将指针传递给新数据(这将是allocator + sizeof(Block)
的返回allocator + sizeof(Block)
。
释放数据后,别忘了先调用析构函数,因为这是放置新对象所必需的。
当然,您仍然需要解决许多小细节,但这应该可以帮助您开始。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.