文章

std::pmr -- 内存池

1. 介绍

使用C++ 17的多态内存管理器(PMR),可以实现一个简单的内存池。根据选择(std::pmr::memory_resource),可以在内存不够的时候,向upstream申请内存。

标准内存资源列表:

memory_resource派生类效率线程安全内存
std::pmr::synchronized_pool_resource()效率低(内部需要上锁)线程安全更少碎片化
std::pmr::unsynchronized_pool_resource()效率较高(内部不需要上锁)非线程安全更少碎片化
std::pmr::monotonic_buffer_resource()效率最高非线程安全“只进不出”(从不释放、可传递进可选的缓冲区)

两个返回指向单例全局内存资源指针的函数:

函数名特点
std::pmr::new_delete_resource()默认的内存资源(转发给传统 new/delete)
std::pmr::null_memory_resource()“永远拒绝”

2. 示例

  • 基本示例:std::pmr::monotonic_buffer_resource的基本用法:src/hello_prm
  • 使用std::pmr::polymorphic_allocator初始化对象(alloc + construct):src/polymorphic_allocator
  • benchmark:不同memory_resource实现的性能对比:src/benchmark

用户自定义类使用PMR分配之后的析构:

1
2
3
using user_class_alloc_traits = std::allocator_traits<std::pmr::polymorphic_allocator<UserClass>>;
user_class_alloc_traits::destroy(userclass_allocator, userclass);
user_class_alloc_traits::deallocate(userclass_allocator, userclass, 1);

3. 参考

本文由作者按照 CC BY 4.0 进行授权