std::pmr::set_default_resource
From cppreference.com
C++
Feature test macros (C++20)
Concepts library (C++20)
Metaprogramming library (C++11)
Ranges library (C++20)
Filesystem library (C++17)
Concurrency support library (C++11)
Execution control library (C++26)
Memory management library
(exposition only*)
(C++11)
(C++23)
(C++11)
(C++17)
(C++11)
(C++11)
(C++20)
(C++20)
(C++17)
(C++11)
(C++17)
(C++20)
(C++17)
(C++17)
(C++17)
(C++17)
(C++17)
(C++17)
(C++20)
(C++20)
(C++20)
(C++20)
(C++20)
(C++20)
(C++20)
(C++20)
(C++20)
(C++20)
(C++17)
(C++17)
pmr::set_default_resource
(C++17)
(C++17)
(C++17)
(C++17)
(C++17)
(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)
(C++11)
(C++11)
(C++17)
(C++20)
(C++17)
(C++11)
(C++11)
(C++11)
(until C++17*)
(C++11)
(C++17)
(C++26)
(C++26)
(C++11)
(C++11)
(C++11)
(C++23)
(C++23)
(C++11)
(C++20)
(C++11)
(C++11)
(C++20)
(C++26)
Defined in header
<memory_resource>
std::pmr::memory_resource * set_default_resource( std::pmr::memory_resource * r ) noexcept;
(since C++17)
If r is not null, sets the default memory resource pointer to r; otherwise, sets the default memory resource pointer to std::pmr::new_delete_resource ().
The default memory resource pointer is used by certain facilities when an explicit memory resource is not supplied. The initial default memory resource pointer is the return value of std::pmr::new_delete_resource .
This function is thread-safe. Every call to std::pmr::set_default_resource
synchronizes with (see std::memory_order ) the subsequent std::pmr::set_default_resource
and std::pmr::get_default_resource calls.
[edit] Return value
Returns the previous value of the default memory resource pointer.
[edit] Example
Run this code
#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 << "+ Allocating " << bytes << " 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 << "- Deallocating " << bytes << " 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 << "Entering scope #1 (without buffer on stack)...\n"; std::cout << "Creating vector v...\n"; std::pmr::vector <std::uint16_t > v{1, 2, 3, 4}; std::cout << "v.data() @ " << v.data() << '\n'; std::cout << "Requesting more...\n"; for (int i{0}; i != push_back_limit; ++i) { v.push_back(i); std::cout << "v.size(): " << v.size() << '\n'; } std::cout << "Exiting scope #1...\n"; } std::cout << '\n'; { std::cout << "Entering scope #2 (with buffer on stack)...\n"; std::uint8_t buffer[16]; std::cout << "Allocating buffer on stack: " << sizeof buffer << " bytes @ " << static_cast<void*>(buffer) << '\n'; std::pmr::monotonic_buffer_resource mem_res{std::data (buffer), std::size (buffer)}; std::cout << "Creating 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 << "Requesting more...\n"; for (int i{0}; i != push_back_limit; ++i) { v.push_back(i); std::cout << "v.size(): " << v.size() << '\n'; } std::cout << "Exiting scope #2...\n"; } }
Possible output:
Entering scope #1 (without buffer on stack)... Creating vector v... + Allocating 8 bytes @ 0x1f75c30 v.data() @ 0x1f75c30 Requesting more... + Allocating 16 bytes @ 0x1f75c50 - Deallocating 8 bytes @ 0x1f75c30 v.size(): 5 v.size(): 6 v.size(): 7 v.size(): 8 + Allocating 32 bytes @ 0x1f75c70 - Deallocating 16 bytes @ 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 + Allocating 64 bytes @ 0x1f75ca0 - Deallocating 32 bytes @ 0x1f75c70 v.size(): 17 v.size(): 18 v.size(): 19 v.size(): 20 Exiting scope #1... - Deallocating 64 bytes @ 0x1f75ca0 Entering scope #2 (with buffer on stack)... Allocating buffer on stack: 16 bytes @ 0x7fffbe9f8240 Creating vector v... v.data() @ 0x7fffbe9f8240 Requesting more... + Allocating 64 bytes @ 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 + Allocating 128 bytes @ 0x1f75cf0 v.size(): 17 v.size(): 18 v.size(): 19 v.size(): 20 Exiting scope #2... - Deallocating 128 bytes @ 0x1f75cf0 - Deallocating 64 bytes @ 0x1f75ca0
[edit] See also
(C++17)
(function) [edit]