【问题标题】:Adapting a fixed-sized chunk pool allocator to certain STL containers使固定大小的块池分配器适应某些 STL 容器
【发布时间】:2018-04-01 16:38:13
【问题描述】:

我有一个作为练习写的池分配器,它实现了 C++11 的 std::allocator 要求并且运行良好,但我用作参考的策略(基于以下论文):

https://pdfs.semanticscholar.org/4321/a91d635d023ab25a743c698be219edcdb1a3.pdf

只有在一次将单个对象分配到一个足够大的内存块时才真正有用。

我注意到 std::allocator 模板方法“allocate”有一个参数,STL 容器可以在该参数中请求同时分配的块数。例如,它看起来像 std::basic_string,一旦它超过了它保留在堆栈上的某个大小的字符串,通过从分配器请求一个足够大以存储 char 数组的连续内存块,立即将整个内容移动到堆中拿着整个字符串。 std::vector 的动态扩展似乎以类似的方式工作。

有没有办法调整分配器,该分配器旨在将固定大小的块返回到这种类型的 STL 容器?

【问题讨论】:

  • 标准分配器需要能够为其模板化类型的指定数量的项目分配连续存储。
  • 可以提供(可选)成员size_type max_size(),违反时抛出

标签: c++ c++11 memory-management stl


【解决方案1】:

你可以走这条路:

On the other hand, multiple instances of numerous fixed-sized
pools can be used to produce a general overall flexible
general solution to work in place of the current system
memory manager.

并将每个不同大小的请求视为对新池的请求,即您的“对象大小”实际上是对象*计数。 你会烧掉很多内存。 您可以为数组大小设置一个上限,然后回退到高于该上限的默认通用分配。

【讨论】:

  • 我注意到我的实现似乎足够通用,我可以将分配器放在分配器中,即创建一个由 N 个内存池组成的内存池,这些内存池本身分配足够大的连续存储块以容纳字符数组比如说 std::basic_string。不幸的是,std::basic_string 期望它的分配器以字符类型为模板,而不是指向 char 数组的指针,所以我必须想办法修改实现,使其块大小足够大以返回连续存储以基本类型为模板时
  • 在分配函数中添加第二个参数,即单位数。
猜你喜欢
  • 2013-10-28
  • 1970-01-01
  • 2020-03-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2022-01-14
相关资源
最近更新 更多