std::pmr::set_default_resource

来自cppreference.com
< cpp‎ | memory
 
 
工具库
语言支持
类型支持(基本类型、RTTI)
库功能特性测试宏 (C++20)
动态内存管理
程序工具
协程支持 (C++20)
变参数函数
调试支持
(C++26)
三路比较
(C++20)
(C++20)(C++20)(C++20)
(C++20)(C++20)(C++20)
通用工具
日期和时间
函数对象
格式化库 (C++20)
(C++11)
关系运算符 (C++20 中弃用)
整数比较函数
(C++20)(C++20)(C++20)   
(C++20)
交换类型运算
(C++14)
(C++11)
(C++11)
(C++11)
(C++17)
常用词汇类型
(C++11)
(C++17)
(C++17)
(C++17)
(C++11)
(C++17)
(C++23)
初等字符串转换
(C++17)
(C++17)

 
动态内存管理
未初始化内存算法
受约束的未初始化内存算法
分配器
垃圾收集器支持
(C++11)(C++23 前)
(C++11)(C++23 前)
(C++11)(C++23 前)
(C++11)(C++23 前)
(C++11)(C++23 前)
(C++11)(C++23 前)



 
在标头 <memory_resource> 定义
std::pmr::memory_resource* set_default_resource( std::pmr::memory_resource* r ) noexcept;
(C++17 起)

r 非空,则设置默认内存资源指针为 r;否则,设置默认内存资源指针为 std::pmr::new_delete_resource()

默认内存资源指针为某些设施在未显式提供内存资源使所用。初始的默认内存资源指针是 std::pmr::new_delete_resource 的返回值。

此函数是线程安全的。每个对 std::pmr::set_default_resource 的调用同步于(见 std::memory_order)后继的 std::pmr::set_default_resourcestd::pmr::get_default_resource 调用。

返回值

返回先前默认内存资源指针的值。

示例

#include <array>
#include <cstddef>
#include <cstdint>
#include <iostream>
#include <iterator>
#include <memory_resource>
#include <vector>
 
class noisy_allocator : public std::pmr::memory_resource
{
    void* do_allocate(std::size_t bytes, std::size_t alignment) override
    {
        std::cout << "+ 分配 " << bytes << " 字节 @ ";
        void* p = std::pmr::new_delete_resource()->allocate(bytes, alignment);
        std::cout << p << '\n';
        return p;
    }
 
    void do_deallocate(void* p, std::size_t bytes, std::size_t alignment) override
    {
        std::cout << "- 解分配 " << bytes << " 字节 @ " << p << '\n';
        return std::pmr::new_delete_resource()->deallocate(p, bytes, alignment);
    }
 
    bool do_is_equal(const std::pmr::memory_resource& other) const noexcept override
    {
        return std::pmr::new_delete_resource()->is_equal(other);
    }
};
 
int main()
{
    constexpr int push_back_limit{16};
    noisy_allocator mem;
    std::pmr::set_default_resource(&mem);
 
    {
        std::cout << "进入作用域 #1 (没有栈缓冲区)...\n";
        std::cout << "创建 vector v...\n";
        std::pmr::vector<std::uint16_t> v{1, 2, 3, 4};
        std::cout << "v.data() @ " << v.data() << '\n';
 
        std::cout << "继续请求...\n";
        for (int i{0}; i != push_back_limit; ++i)
        {
            v.push_back(i);
            std::cout << "v.size(): " << v.size() << '\n';
        }
        std::cout << "退出作用域 #1...\n";
    }
 
    std::cout << '\n';
 
    {
        std::cout << "进入作用域 #2 (有栈缓冲区)...\n";
 
        std::uint8_t buffer[16];
        std::cout << "分配栈上缓冲区: " << sizeof buffer << " 字节 @ "
                  << static_cast<void*>(buffer) << '\n';
        std::pmr::monotonic_buffer_resource mem_res{std::data(buffer), std::size(buffer)};
 
        std::cout << "创建 vector v...\n";
        std::pmr::vector<std::uint16_t> v{{1, 2, 3, 4}, &mem_res};
        std::cout << "v.data() @ " << v.data() << '\n'; // equals to `buffer` address
 
        std::cout << "继续请求...\n";
        for (int i{0}; i != push_back_limit; ++i)
        {
            v.push_back(i);
            std::cout << "v.size(): " << v.size() << '\n';
        }
        std::cout << "退出作用域 #2...\n";
    }
}

可能的输出:

进入作用域 #1 (没有栈缓冲区)...
创建 vector v...
+ 分配 8 字节 @ 0x1f75c30
v.data() @ 0x1f75c30
继续请求...
+ 分配 16 字节 @ 0x1f75c50
- 解分配 8 字节 @ 0x1f75c30
v.size(): 5
v.size(): 6
v.size(): 7
v.size(): 8
+ 分配 32 字节 @ 0x1f75c70
- 解分配 16 字节 @ 0x1f75c50
v.size(): 9
v.size(): 10
v.size(): 11
v.size(): 12
v.size(): 13
v.size(): 14
v.size(): 15
v.size(): 16
+ 分配 64 字节 @ 0x1f75ca0
- 解分配 32 字节 @ 0x1f75c70
v.size(): 17
v.size(): 18
v.size(): 19
v.size(): 20
退出作用域 #1...
- 解分配 64 字节 @ 0x1f75ca0
 
进入作用域 #2 (有栈缓冲区)...
分配栈上缓冲区: 16 字节 @ 0x7fffbe9f8240
创建 vector v...
v.data() @ 0x7fffbe9f8240
继续请求...
+ 分配 64 字节 @ 0x1f75ca0
v.size(): 5
v.size(): 6
v.size(): 7
v.size(): 8
v.size(): 9
v.size(): 10
v.size(): 11
v.size(): 12
v.size(): 13
v.size(): 14
v.size(): 15
v.size(): 16
+ 分配 128 字节 @ 0x1f75cf0
v.size(): 17
v.size(): 18
v.size(): 19
v.size(): 20
退出作用域 #2...
- 解分配 128 字节 @ 0x1f75cf0
- 解分配 64 字节 @ 0x1f75ca0

参阅

获取缺省 std::pmr::memory_resource
(函数)
返回一个静态的程序范围 std::pmr::memory_resource,它使用全局 operator newoperator delete 分配和解分配内存
(函数)