新的c++代码应该使用内存资源而不是分配器吗?
Should new C++ code use memory resources instead of allocators?
c++ 17将为我们带来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
中来实例化一个仍然使用分配器的子对象。 无论如何,内存分配是一项相对工作密集型的任务。相对而言,单个虚函数调用不会增加太多开销。
关于如何有效地使用新的库特性,是否已经存在任何建议?
此时no.
c++中的分配器现在比以前容易多了。
它们提供pmr(多态)和经典分配器支持。
更重要的是,基于pmr的分配多年来没有大量使用。任何弱点都可能暴露。
基于池的快速分配器,甚至是固定的缓冲区分配器或sbo(小缓冲区优化)扩展,可能会注意到虚拟化开销。
相关文章:
- 具有瞬态资源的RAII类
- C++ 雷神库 - 使用资源加载器类时出现问题(不命名类型)
- 允许从 std::map 的密钥窃取资源?
- 参考资源文件VC++中的$(SolutionDir)
- 当有分配器意识的容器被复制/移动时,反弹分配器是否被复制/移走
- 如何维护资源管理器项目视图中当前可见的项目列表
- 将 std::allocate_shared 与多态资源分配器一起使用
- 尝试将lambda函数放在队列中时出现一般分配器错误(可能是与unique_ptr有关的错误)
- 使用RAII在给定次数的迭代后重新分配资源
- 资源管理设计模式
- 如何跨平台将二进制资源构建到程序中?
- C++17 - 使用自定义分配器的节点提取/重新插入 - 适用于 clang++/libc++,但不适用于 libstd
- SetDlgItemInt 不会更改嵌入资源的编辑框
- Klocwork Inside的资源泄漏
- 从存储为 Windows 资源 (c++) 的 png 中获取 png 文件数据
- C++链接时间资源"allocation"而不定义
- 使用 Bazel 生成 QT 资源文件
- 编译器资源管理器和 GCC 具有不同的输出
- 使用 std::分配器在 constexpr 中进行默认初始化
- 新的c++代码应该使用内存资源而不是分配器吗?