Namespaces
Variants

std::pmr:: set_default_resource

From cppreference.net
Memory management library
( exposition only* )
Allocators
Uninitialized memory algorithms
Constrained uninitialized memory algorithms
Memory resources
pmr::set_default_resource
(C++17)
Uninitialized storage (until C++20)
( until C++20* )
( until C++20* )
( until C++20* )

Garbage collector support (until C++23)
(C++11) (until C++23)
(C++11) (until C++23)
(C++11) (until C++23)
(C++11) (until C++23)
(C++11) (until C++23)
(C++11) (until 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::pmr::set_default_resource std::pmr::get_default_resource 调用 实现同步 (参见 std::memory_order )。

返回值

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

示例

#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 << "创建向量 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 << "创建向量 v...\n";
        std::pmr::vector<std::uint16_t> v{{1, 2, 3, 4}, &mem_res};
        std::cout << "v.data() @ " << v.data() << '\n'; // 等于 `buffer` 地址
        std::cout << "请求更多空间...\n";
        for (int i{0

参见

获取默认的 std::pmr::memory_resource
(函数)
返回一个静态的程序级 std::pmr::memory_resource ,该资源使用全局 operator new operator delete 来分配和释放内存
(函数)