std::pmr::set_default_resource
来自cppreference.com
在标头 <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_resource
及 std::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
参阅
(C++17) |
获取缺省 std::pmr::memory_resource (函数) |
(C++17) |
返回一个静态的程序范围 std::pmr::memory_resource,它使用全局 operator new 与 operator delete 分配和解分配内存 (函数) |