std::pmr是C++17引入的多态内存资源库,通过memory_resource统一接口实现可替换的内存分配策略。

std::pmr 是 C++17 引入的“多态内存资源”(Polymorphic Memory Resource)库,位于 头文件中。它的核心目标是提供一种灵活、高效的自定义内存分配机制,允许程序员在不改变接口代码的前提下,动态选择不同的内存分配策略。
什么是 std::pmr?
std::pmr 基于“内存资源”(memory resource)抽象,通过统一接口管理内存的申请与释放。它使用运行时多态(非模板),使得容器或对象可以在创建时指定使用哪个内存资源,从而实现内存分配行为的可替换性。
关键组件包括:
- std::pmr::memory_resource:抽象基类,定义 do_allocate、do_deallocate、do_is_equal 三个虚函数。
- std::pmr::pool_options:配置池式资源的参数,如最大块大小、池增长方式。
- std::pmr::synchronized_pool_resource:线程安全的内存池,适合频繁小对象分配。
- std::pmr::unsynchronized_pool_resource:非线程安全,性能更高,适用于单线程场景。
- std::pmr::monotonic_buffer_resource:基于大缓冲区的递增式分配器,释放时通常一次性归还。
- std::pmr::vector、std::pmr::string 等:标准容器的 pmr 版本,接受 memory_resource* 参数。
如何使用自定义内存分配策略?
你可以通过继承 std::pmr::memory_resource 实现自己的分配逻辑,也可以直接使用标准提供的资源类型来优化性能。
立即学习“C++免费学习笔记(深入)”;
常见用法示例:
#include#include #include int main() { // 使用单调缓冲区资源,高效但批量释放 char buffer[1024]; std::pmr::monotonic_buffer_resource pool{buffer, sizeof(buffer)};
// 创建 pmr vector,使用自定义资源 std::pmr::vectorvec{&pool}; for (int i = 0; i < 100; ++i) { vec.push_back(i); } std::cout << "Size: " << vec.size() << "\n"; // 资源析构时自动回收所有内存 return 0; }
这段代码将 vector 的元素分配在栈上 buffer 中,避免了多次堆分配,特别适合临时数据处理。
适用场景与优势
std::pmr 特别适合以下情况:
- 高性能服务:减少 malloc/free 开销,使用内存池提升小对象分配效率。
- 嵌入式系统:在内存受限环境中预分配固定区域,避免运行时碎片。
- 游戏开发:按帧或场景使用 monotonic_buffer_resource 批量分配与释放。
- 调试与监控:包装其他资源,记录分配行为,检测泄漏。
相比传统 allocator,std::pmr 更加轻量且易于组合。你不需要为每个容器实例化新类型,只需传递不同 resource 指针即可切换策略。
基本上就这些。std::pmr 不复杂但容易忽略细节,掌握后能显著提升程序的内存控制能力。










