std::pmr::set_default_resource
From 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::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 << "+ 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"; } }
実行結果の例
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
[編集] 関連項目
| (C++17) |
デフォルトの std::pmr::memory_resource を取得します (関数) |
| (C++17) |
メモリの確保と解放にグローバルな operator new と operator delete を使用する、静的なプログラムワイドな std::pmr::memory_resource を返します (関数) |