std::pmr:: set_default_resource
|
|
|||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
|
定义于头文件
<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
参见
|
(C++17)
|
获取默认的
std::pmr::memory_resource
(函数) |
|
(C++17)
|
返回一个静态的程序级
std::pmr::memory_resource
,该资源使用全局
operator new
和
operator delete
来分配和释放内存
(函数) |