`memory_resource` 的目的和用途是什么?

31
标准的C++17新增了一个名为pmr的命名空间,其中包含一组以memory_resource名称分组的类。在互联网上搜索后,我发现关于它的通俗易懂的信息很少,这就是这个问题产生的直接原因: pmr及特别是pmr::memory_resource的主要思想是什么? 更具体地说,我心中有一些疑问:
  • 它带来了什么新东西,或者它解决了哪些限制?
  • allocator有什么区别?
  • “polymorphic”是否意味着可以在运行时选择提供给容器构造函数的allocator(例如,用于测试目的)?
  • 对于实现内存池或其他内存管理方案有帮助吗?
背景:
打算创建一个memory pool分配器,在此过程中发现了这个命名空间。看到像pool_optionspolymorphic_allocator这样的名称引起了我的注意。
相关问题: polymorphic_allocator: when and why should I use it?

http://en.cppreference.com/w/cpp/memory/memory_resource - πάντα ῥεῖ
另请参阅 https://dev59.com/JVoT5IYBdhLWcg3w8S-2。 - Curious
@Curious:非常有趣的链接,如果你同意的话,我会将其相关联,因为它解释了该主题的一个子集。 - Adrian Maire
@AdrianMaire 我不太明白,您是想把它包含在问题中吗?如果是的话,请直接添加。 - Curious
1
@AdrianMaire:但是你所有的问题都在那里得到了解答。memory_resource是你从中派生出来以实现多态分配功能的,这通过分配器类型polymorphic_allocator来公开。 - Nicol Bolas
@NicolBolas:包含是单向的:Polymorphic_allocator是memory_resource的一部分,但memory_resource不仅仅是Polymorphic_allocator。我特别关注内存池,因此有一个完整的章节介绍pool_optionssynchronized_pool_resourceunsynchronized_pool_resourcemonotonic_buffer_resourcememory_resource class...只有polymorphic_allocator被回答了一半。另一方面,您关闭了问题,因为它是重复的问题而不是重复的答案(请记住,人们不知道答案,通过问题搜索)。 - Adrian Maire
1个回答

13

polymorphic_allocator旨在让您拥有一个分配器,其行为在运行时动态确定。

创建polymorphic_allocator的唯一方法是:

  1. 默认构造,在这种情况下,它使用std::pmr::get_default_resource()的返回值,该返回值是memory_resource*

  2. 传递一个memory_resource*

  3. 从另一个polymorphic_allocator中复制。

因此,对于polymorphic_allocator的定制点是创建一个继承自memory_resource 的类并实现其方法、或者使用定义在std::pmr中的预声明的memory_resource: (un)synchronized_pool_resourcemonotonic_buffer_resource作为类型,或者std::pmr::new_delete_resource() / std::pmr::null_memory_resource()

假设您希望使用与std::pmr提供的5种不同的策略来分配内存。然后,您可以创建一个继承自std::pmr::memory_resource的类,并将其传递给使用polymorphic_allocator的容器。


与“allocator”相比有什么不同? - user4945014
@matt 第一段? - Yakk - Adam Nevraumont
你能否提供更多关于为什么常规分配器无法在运行时确定其行为的信息?毕竟,它是以相同方式调用的函数。 - user4945014
@mattf 分配器是满足特定要求的类型,而不是函数。 pmr 是一种满足分配器要求的类型,因此您可以在手写的分配器类型中复制 pmr 的实现。这样一个手写的 pmr 不会是std::pmr,但它的行为将与之相同。 - Yakk - Adam Nevraumont
分配器有点奇怪。如果您对它们有一般性的问题,我建议您提出一个问题而不是发表评论。 - Yakk - Adam Nevraumont
显示剩余2条评论

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接