C++17将为我们带来
如果我要编写针对C++17及更高版本的新容器(或其他消耗大量内存的类型),我应该继续使用Allocator概念编程,还是直接使用更新、更干净的抽象呢?
截至目前,我的想法如下。 继续使用分配器的原因:
std::pmr::memory_resource
,这是一个用于分配和释放内存的干净接口。与Allocator概念不同的是,它只做这一件事情,没有其他功能。还会有std::pmr::polymorphic_allocator
,它将内存资源包装成经典分配器,以便与现有容器一起使用。如果我要编写针对C++17及更高版本的新容器(或其他消耗大量内存的类型),我应该继续使用Allocator概念编程,还是直接使用更新、更干净的抽象呢?
截至目前,我的想法如下。 继续使用分配器的原因:
- 它与标准库和现有代码保持一致。即使是新的
std::pmr::*
容器别名也继续使用分配器。 - 由于内存资源可以被包装成
std::pmr::polymorphic_allocator
,因此分配器接口更加通用,满足更多客户的需求。 - 内存资源始终使用运行时多态性,因此与分配器提供的零开销抽象相比,它们具有较小的额外运行时开销。
- 也许实际上有人需要分配器接口的其他部分(例如自定义指针类型),这是纯内存资源无法提供的。
开始使用内存资源而不是分配器的原因:
- 内存分配器接口不太方便实现。而
std::pmr::memory_resource
接口则更为简洁明了。 - 由于内存资源是多态的,它们不会影响容器的类型,这意味着需要实例化的模板较少(因此可能编译更快、可执行文件更小),并且使我们能够将更多的代码移入单独的翻译单位。
- 如果一个对象使用了内存资源,它总是可以实例化一个仍然使用分配器的子对象,方法是将内存资源包装到
std::pmr::polymorphic_allocator
中。反过来就比较困难。 - 内存分配本身已经是相对耗时的任务了,单个虚函数调用并不会增加太多开销,相对而言。
是否已经存在如何有效使用新库特性的建议?