繁体   English   中英

新的 C++ 代码应该使用内存资源而不是分配器吗?

[英]Should new C++ code use memory resources instead of allocators?

C++17 将为我们带来std::pmr::memory_resource ,它是一个用于分配和释放内存的干净接口。 Allocator概念不同,它仅能做到这一点,此而已。 还将有std::pmr::polymorphic_allocator将内存资源包装到经典分配器中,以便它可以与现有容器一起使用。

如果我要编写一个针对 C++17 及更高版本的新容器(或其他内存饥饿)类型,我应该继续针对分配器概念进行编程还是直接使用更新和更清晰的抽象?

到目前为止,我的想法是这样的。

继续使用分配器的原因:

  • 它与标准库和现有代码一致。 即使是新的std::pmr::*容器别名也继续使用分配器。
  • 由于可以将内存资源包装到std::pmr::polymorphic_allocator ,因此 allocator 接口更加通用,可以满足更多客户端的需求。
  • 内存资源始终使用运行时多态性,因此与分配器可以提供的零开销抽象相比,它们具有较小的额外运行时开销。
  • 也许有人实际上需要纯内存资源无法提供的分配器接口的其他部分(例如自定义指针类型)。

开始使用内存资源而不是分配器的原因:

  • 分配器接口笨拙且难以实现。 std::pmr::memory_resource接口简洁明了。
  • 由于内存资源是多态的,它们不会影响容器的类型,这意味着更少的模板实例(因此可能更快的编译和更小的可执行文件)并使我们能够将更多代码移动到单独的翻译单元中。
  • 如果一个对象使用内存资源,它总是可以通过将内存资源包装到std::pmr::polymorphic_allocator来实例化仍然使用分配器的子对象。 反过来就更难了。
  • 无论如何,内存分配是一项相对工作密集的任务。 相对而言,单个虚函数调用不会增加太多开销。

是否已经存在关于如何有效使用新库功能的任何建议?

在这一点上没有。

C++ 中的分配器目前比以前容易得多。

它们提供 pmr(多态)和经典分配器支持。

更重要的是,基于 pmr 的分配多年来一直没有被大量使用。 任何弱点都可能会暴露出来。

基于快速池的分配器,甚至固定缓冲区分配器或 sbo(小缓冲区优化)扩展,可能会注意到虚拟化开销。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

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