c++中的std::pmr是什么_c++多态内存资源与内存池【C++17】

admin 百科 22
std::pmr 是 C++17 引入的多态内存资源库,通过 std::pmr::memory_resource 抽象接口解耦分配逻辑与容器,支持运行时切换内存策略(如池、arena、栈分配),并提供 pmr 容器别名和资源组合能力。

c++中的std::pmr是什么_c++多态内存资源与内存池【C++17】-第1张图片-佛山资讯网

std::pmr 是 C++17 引入的 Polymorphic Memory Resource(多态内存资源)库,核心目标是解耦内存分配逻辑与容器实现,让开发者能灵活替换容器背后的内存管理策略,比如用内存池、栈分配器、线程局部缓存等替代默认的 new/delete

它不是新分配器,而是“分配器的抽象基类”

std::pmr 提供的是 std::pmr::memory_resource —— 一个纯虚接口,定义了 allocate()deallocate()is_equal() 三个关键函数。所有自定义分配策略(如内存池、代理资源)只要继承并实现它,就可被统一接入 std::pmr 容器。

常见内置实现包括:

  • std::pmr::new_delete_resource():底层调 operator newdelete,行为同默认分配器
  • std::pmr::null_memory_resource():分配即抛异常,用于调试或禁用动态分配
  • std::pmr::synchronized_pool_resource:线程安全的固定大小块内存池(适合高频小对象)
  • std::pmr::unsynchronized_pool_resource:非线程安全、更轻量的池实现
  • std::pmr::monotonic_buffer_resource:单向增长缓冲区(类似 arena),deallocate 无操作,适合短生命周期批量分配

怎么用?从容器开始

std::pmr 提供了一套“别名模板”,比如 std::pmr::vector<int></int> 等价于 std::vector<int std::pmr::polymorphic_allocator>></int>。关键在于:容器本身不持有 memory_resource,而是通过其 allocator 间接使用

立即学习“C++免费学习笔记(深入)”;

典型用法:

std::pmr::synchronized_pool_resource pool;
std::pmr::vector<int> v{&pool}; // 构造时传入 resource 指针
v.push_back(42);
v.push_back(100); // 内存来自 pool,非堆全局分配

登录后复制

也可以后期切换:

标签: c++ stream 为什么

发布评论 0条评论)

还木有评论哦,快来抢沙发吧~