繁体   English   中英

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

[英]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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM