0

0

c++怎么使用std::pmr进行多态内存资源管理_C++17 PMR内存资源管理机制详解

穿越時空

穿越時空

发布时间:2025-11-06 08:19:02

|

592人浏览过

|

来源于php中文网

原创

std::pmr通过memory_resource实现灵活内存管理,支持自定义分配策略;其核心组件包括memory_resource、polymorphic_allocator及多种派生资源类型,可用于高性能场景。

c++怎么使用std::pmr进行多态内存资源管理_c++17 pmr内存资源管理机制详解

在C++17中,std::pmr(Polymorphic Memory Resource,多态内存资源)提供了一套灵活的内存管理机制,允许程序在不同内存池之间动态切换分配策略,而无需修改使用代码。它基于 memory_resource 抽象接口,实现运行时决定内存分配方式,适用于高性能、低延迟或需要精细控制内存布局的场景。

理解 std::pmr 的核心组件

std::pmr 的设计围绕几个关键类型展开:

  • std::pmr::memory_resource:抽象基类,定义了 do_allocate 和 do_deallocate 等虚函数,用于定制内存分配行为。
  • std::pmr::pool_options:配置池式资源(如 monotonic_buffer_resource)的行为参数。
  • 派生资源类型:如 std::pmr::synchronized_pool_resource、std::pmr::monotonic_buffer_resource、std::pmr::null_memory_resource 等。
  • std::pmr::polymorphic_allocator:模板分配器,绑定到某个 memory_resource 实例,供容器使用。

所有这些都位于 头文件中(C++17 起可用)。

如何创建和使用自定义内存资源

你可以通过继承 memory_resource 来实现自己的分配逻辑,但更常见的是使用标准库提供的现成资源。

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

例如,使用 monotonic_buffer_resource 创建一个基于缓冲区的快速分配器:

#include 
#include 
#include 

int main() { // 分配一块大缓冲区作为后端存储 char buffer[1024]; std::pmr::monotonic_buffer_resource pool{buffer, sizeof(buffer)};

// 使用该资源创建 polymorphic allocator
std::pmr::polymorphic_allocatorzuojiankuohaophpcnintyoujiankuohaophpcn alloc{&pool};

// 构造一个使用此分配器的 vector
std::pmr::vectorzuojiankuohaophpcnintyoujiankuohaophpcn vec{alloc};
for (int i = 0; i zuojiankuohaophpcn 100; ++i)
    vec.push_back(i);

std::cout zuojiankuohaophpcnzuojiankuohaophpcn "Size: " zuojiankuohaophpcnzuojiankuohaophpcn vec.size() zuojiankuohaophpcnzuojiankuohaophpcn "\n";
return 0;

}

上面的例子中,所有对 vector 的内存请求都会由 pool 处理。由于 monotonic_buffer_resource 是“递增式”分配,释放操作通常被忽略(除非显式 reset),适合一次性批量分配场景。

使用 synchronized_pool_resource 进行高效对象池管理

对于频繁申请小块内存的场景(如大量 small vector 或 string),synchronized_pool_resource 更合适:

抖云猫AI论文助手
抖云猫AI论文助手

一款AI论文写作工具,最快 2 分钟,生成 3.5 万字论文。论文可插入表格、代码、公式、图表,依托自研学术抖云猫大模型,生成论文具备严谨的学术专业性。

下载
std::pmr::synchronized_pool_resource pool;

// 所有使用这个资源的分配器将共享同一个池 { std::pmr::vector v1{&pool}; v1.resize(50);

std::pmr::string s1{"Hello PMR", &pool};

} // 析构时自动归还内存到池中

这个资源内部维护多个按大小分类的内存池,减少碎片并提升速度。它是线程安全的(名字中的 synchronized 指此意)。

注意:你不能直接 delete 通过 pmr 分配的内存,而是依赖于容器或资源本身的生命周期管理。比如调用 pool.release() 可以释放全部池内存。

容器与 std::pmr 的集成

C++17 提供了许多 std::pmr::XXX 容器别名,它们默认使用 polymorphic_allocator

  • std::pmr::vector
  • std::pmr::deque
  • std::pmr::list
  • std::pmr::map
  • std::pmr::string
  • std::pmr::unordered_set

这些容器构造时可接受 memory_resource* 参数,内部会转换为 polymorphic_allocator 并用于后续分配。

也可以手动传递分配器:

std::pmr::memory_resource* my_res = std::pmr::get_default_resource();
std::pmr::vector vec{std::pmr::polymorphic_allocator{my_res}};

设置全局默认资源

可以使用 set_default_resource() 更改全局默认的 memory_resource:

auto* custom_pool = new std::pmr::synchronized_pool_resource;
std::pmr::set_default_resource(custom_pool);

// 此时新建的 pmr 容器若未指定资源,将使用 custom_pool std::pmr::vector vf; // 自动使用 custom_pool

记得在程序结束前恢复或清理资源,避免泄漏。

基本上就这些。std::pmr 的强大之处在于它把内存分配策略从具体类型中解耦,让性能优化变得模块化且可配置。合理使用能显著提升特定场景下的效率,尤其是高频小对象分配或需要确定性内存行为的系统中。

相关专题

更多
string转int
string转int

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

358

2023.08.02

resource是什么文件
resource是什么文件

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

150

2023.12.20

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

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

15

2025.11.27

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

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

1051

2023.10.19

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

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

107

2025.10.17

php8.4实现接口限流的教程
php8.4实现接口限流的教程

PHP8.4本身不内置限流功能,需借助Redis(令牌桶)或Swoole(漏桶)实现;文件锁因I/O瓶颈、无跨机共享、秒级精度等缺陷不适用高并发场景。本专题为大家提供相关的文章、下载、课程内容,供大家免费下载体验。

539

2025.12.29

java接口相关教程
java接口相关教程

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

11

2026.01.19

线程和进程的区别
线程和进程的区别

线程和进程的区别:线程是进程的一部分,用于实现并发和并行操作,而线程共享进程的资源,通信更方便快捷,切换开销较小。本专题为大家提供线程和进程区别相关的各种文章、以及下载和课程。

482

2023.08.10

C++ 高级模板编程与元编程
C++ 高级模板编程与元编程

本专题深入讲解 C++ 中的高级模板编程与元编程技术,涵盖模板特化、SFINAE、模板递归、类型萃取、编译时常量与计算、C++17 的折叠表达式与变长模板参数等。通过多个实际示例,帮助开发者掌握 如何利用 C++ 模板机制编写高效、可扩展的通用代码,并提升代码的灵活性与性能。

10

2026.01.23

热门下载

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

精品课程

更多
相关推荐
/
热门推荐
/
最新课程
Node.js 教程
Node.js 教程

共57课时 | 9.2万人学习

CSS3 教程
CSS3 教程

共18课时 | 4.8万人学习

Vue 教程
Vue 教程

共42课时 | 7万人学习

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

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