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分配之后的析构:

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. 参考




    Enjoy Reading This Article?

    Here are some more articles you might like to read next:

  • al-folio 本地部署记录(Ubuntu 24.04)
  • C++ Traits
  • 道格拉斯-普克算法(Douglas–Peucker algorithm)
  • CMake支持库收集
  • QGC代码架构解析:飞行前检查(起飞条件)