0

0

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

裘德小鎮的故事

裘德小鎮的故事

发布时间:2025-12-09 11:37:40

|

145人浏览过

|

来源于php中文网

原创

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

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

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 等价于 std::vector>。关键在于:容器本身不持有 memory_resource,而是通过其 allocator 间接使用

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

典型用法:

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

也可以后期切换:

九歌
九歌

九歌--人工智能诗歌写作系统

下载
std::pmr::monotonic_buffer_resource arena{buffer, sizeof(buffer)};
std::pmr::vector strings{&arena};
strings.emplace_back("hello"); // string 的 char[] 也由 arena 分配

资源嵌套与传播:注意生命周期和所有权

memory_resource 通常不拥有底层内存,只负责调度。例如 monotonic_buffer_resource 可绑定外部缓冲区(栈数组或 malloc 块),而 pool_resource 内部会用 upstream_resource()(默认是 new_delete_resource)来获取大块内存再切分。

重要规则:

  • resource 对象的生命周期必须长于使用它的容器
  • 多个容器可共享同一 resource,实现内存复用
  • resource 之间可组合(如池作为上游给 arena),形成分配策略链

为什么需要它?解决什么问题?

传统模板分配器(如 std::allocator)是类型擦除的——每个容器实例都绑死一个具体分配器类型,无法运行时更换;而 pmr 在保持零开销抽象前提下,实现了运行时多态 + 编译时类型擦除

典型适用场景:

  • 游戏/实时系统中避免堆碎片,用 arena 或池统一管理帧内存
  • 网络服务中为每个请求分配独立内存池,便于快速整体释放
  • 单元测试中注入 mock resource 验证内存行为
  • 跨 DLL 边界安全传递容器(统一使用进程级 default_resource)

基本上就这些。它不复杂但容易忽略——真正价值不在写新 resource,而在把已有容器无缝接入你设计好的内存模型里。

相关专题

更多
resource是什么文件
resource是什么文件

Resource文件是一种特殊类型的文件,它通常用于存储应用程序或操作系统中的各种资源信息。它们在应用程序开发中起着关键作用,并在跨平台开发和国际化方面提供支持。本专题为大家提供相关的文章、下载、课程内容,供大家免费下载体验。

149

2023.12.20

java多态详细介绍
java多态详细介绍

本专题整合了java多态相关内容,阅读专题下面的文章了解更多详细内容。

15

2025.11.27

string转int
string转int

在编程中,我们经常会遇到需要将字符串(str)转换为整数(int)的情况。这可能是因为我们需要对字符串进行数值计算,或者需要将用户输入的字符串转换为整数进行处理。php中文网给大家带来了相关的教程以及文章,欢迎大家前来学习阅读。

318

2023.08.02

int占多少字节
int占多少字节

int占4个字节,意味着一个int变量可以存储范围在-2,147,483,648到2,147,483,647之间的整数值,在某些情况下也可能是2个字节或8个字节,int是一种常用的数据类型,用于表示整数,需要根据具体情况选择合适的数据类型,以确保程序的正确性和性能。本专题为大家提供相关的文章、下载、课程内容,供大家免费下载体验。

538

2024.08.29

c++怎么把double转成int
c++怎么把double转成int

本专题整合了 c++ double相关教程,阅读专题下面的文章了解更多详细内容。

52

2025.08.29

C++中int的含义
C++中int的含义

本专题整合了C++中int相关内容,阅读专题下面的文章了解更多详细内容。

197

2025.08.29

硬盘接口类型介绍
硬盘接口类型介绍

硬盘接口类型有IDE、SATA、SCSI、Fibre Channel、USB、eSATA、mSATA、PCIe等等。详细介绍:1、IDE接口是一种并行接口,主要用于连接硬盘和光驱等设备,它主要有两种类型:ATA和ATAPI,IDE接口已经逐渐被SATA接口;2、SATA接口是一种串行接口,相较于IDE接口,它具有更高的传输速度、更低的功耗和更小的体积;3、SCSI接口等等。

1023

2023.10.19

PHP接口编写教程
PHP接口编写教程

本专题整合了PHP接口编写教程,阅读专题下面的文章了解更多详细内容。

65

2025.10.17

高德地图升级方法汇总
高德地图升级方法汇总

本专题整合了高德地图升级相关教程,阅读专题下面的文章了解更多详细内容。

43

2026.01.16

热门下载

更多
网站特效
/
网站源码
/
网站素材
/
前端模板

精品课程

更多
相关推荐
/
热门推荐
/
最新课程
国外Web开发全栈课程全集
国外Web开发全栈课程全集

共12课时 | 1.0万人学习

进程与SOCKET
进程与SOCKET

共6课时 | 0.3万人学习

关于我们 免责申明 举报中心 意见反馈 讲师合作 广告合作 最新更新
php中文网:公益在线php培训,帮助PHP学习者快速成长!
关注服务号 技术交流群
PHP中文网订阅号
每天精选资源文章推送

Copyright 2014-2026 https://www.php.cn/ All Rights Reserved | php.cn | 湘ICP备2023035733号