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 が null でない場合、デフォルトメモリリソースポインタを r に設定する。null の場合、デフォルトメモリリソースポインタを std:: pmr :: new_delete_resource ( ) に設定する。

default memory resource pointer は、明示的にメモリリソースが指定されない場合に特定の機能によって使用されます。初期のデフォルトメモリリソースポインタは std::pmr::new_delete_resource の戻り値です。

この関数はスレッドセーフです。 std::pmr::set_default_resource へのすべての呼び出しは、後続の std::pmr::set_default_resource および std::memory_order 呼び出しと 同期します 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
(注:元のテキストはC++の専門用語であり、HTMLタグも保持されているため、翻訳対象外です)
{
    void* do_allocate(std::size_t bytes, std::size_t alignment) override
    {
        std::cout << "+ メモリ割り当て " << bytes << " バイト @ ";
        void* p = std::pmr::new_delete_resource
(注:指定された条件により、HTMLタグ・属性は保持され、C++固有用語は翻訳せず、コードタグ内ではないがC++用語として扱うため原文のまま維持しています)()->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
(注:指定された条件により、HTMLタグ・属性は保持され、C++固有用語は翻訳せず、コードタグ内ではないがC++用語として扱うため原文のまま維持しています)()->deallocate(p, bytes, alignment);
    }
    bool do_is_equal(const std::pmr::memory_resource
(注:元のテキストはC++の専門用語であり、HTMLタグも保持されているため、翻訳対象外です)& other) const noexcept override
    {
        return std::pmr::new_delete_resource
(注:指定された条件により、HTMLタグ・属性は保持され、C++固有用語は翻訳せず、コードタグ内のテキストも翻訳対象外のため、元のテキストをそのまま保持しています)()->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
(注:元のテキストはC++の専門用語であり、HTMLタグ・属性も含まれていないため、翻訳対象外となります)<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
(注:指定された条件により、HTMLタグ・属性、コード内テキスト、C++固有用語は翻訳対象外のため、元のテキストを保持しています) mem_res{std::data
(注:指定された条件により、HTMLタグ・属性は保持され、タグ内のテキスト(本例では該当なし)は翻訳対象外、C++固有用語(std::data)は非翻訳のため、出力は原文と同一となります)(buffer), std::size
(注:指定された条件により、HTMLタグ・属性は翻訳せず、タグ内のテキストも翻訳対象外のため、元のまま保持されています。C++固有の用語「std::size」は翻訳していません)(buffer)};
        std::cout << "ベクトル v を作成中...\n";
        std::pmr::vector
(注:元のテキストには翻訳対象となる自然言語の文字列が含まれていないため、HTML構造とC++識別子はそのまま保持されています)<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}; i != push_back_limit; ++i)
        {
            v.push_back(i);
            std::cout << "v.size(): " << v.size() << '\n';
        }
        std::cout << "スコープ #2 を終了しています...\n";
    }
}

出力例:

スコープ #1 に入ります(スタック上にバッファなし)...
ベクトル 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
ベクトル 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

関連項目

デフォルトの std::pmr::memory_resource を取得する
(関数)
グローバルな operator new operator delete を使用してメモリの割り当てと解放を行う 静的なプログラム全体の std::pmr::memory_resource を返す
(関数)