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)
Definiert im Header <memory_resource>
std:: pmr :: memory_resource * set_default_resource ( std:: pmr :: memory_resource * r ) noexcept ;
(seit C++17)

Wenn r nicht null ist, setzt es den Standard-Speicherressourcenzeiger auf r ; andernfalls setzt es den Standard-Speicherressourcenzeiger auf std:: pmr :: new_delete_resource ( ) .

Der default memory resource pointer wird von bestimmten Einrichtungen verwendet, wenn kein expliziter memory resource angegeben wird. Der anfängliche default memory resource pointer ist der Rückgabewert von std::pmr::new_delete_resource .

Diese Funktion ist threadsicher. Jeder Aufruf von std::pmr::set_default_resource synchronisiert mit (siehe std::memory_order ) den nachfolgenden std::pmr::set_default_resource - und std::pmr::get_default_resource -Aufrufen.

Rückgabewert

Gibt den vorherigen Wert des Standard-Speicherressourcenzeigers zurück.

Beispiel

#include <array>
#include <cstddef>
#include <cstdint>
#include <iostream>
#include <iterator>
#include <memory_resource>
#include <vector>
class noisy_allocator : public std::pmr::memory_resource
**Erklärung:**
- HTML-Tags und Attribute wurden unverändert beibehalten
- Der C++-Spezifikationsname `std::pmr::memory_resource` wurde nicht übersetzt (gemäß der Anforderung, C++-spezifische Begriffe nicht zu übersetzen)
- Die Formatierung wurde originalgetreu erhalten
- Die Übersetzung beschränkt sich ausschließlich auf die Erklärung außerhalb des eigentlichen Codes
{
    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 << "Betreten von Bereich #1 (ohne Puffer auf dem Stack)...\n";
        std::cout << "Erstellen des Vektors v...\n";
        std::pmr::vector
(Anmerkung: Der Text enthält ausschließlich C++-spezifische Begriffe und HTML-Tags, die gemäß den Anforderungen nicht übersetzt werden müssen. Daher bleibt die Ausgabe identisch mit der Eingabe.)<std::uint16_t> v{1, 2, 3, 4};
        std::cout << "v.data() @ " << v.data() << '\n';
        std::cout << "Anfrage läuft...\n";
        for (int i{0}; i != push_back_limit; ++i)
        {
            v.push_back(i);
            std::cout << "v.size(): " << v.size() << '\n';
        }
        std::cout << "Verlasse Gültigkeitsbereich #1...\n";
    }
    std::cout << '\n';
    {
        std::cout << "Betreten von Gültigkeitsbereich #2 (mit Puffer auf dem Stack)...\n";
        std::uint8_t buffer[16];
        std::cout << "Puffer auf dem Stack allozieren: " << sizeof buffer << " Bytes @ "
                  << static_cast<void*>(buffer) << '\n';
        std::pmr::monotonic_buffer_resource mem_res{std::data(buffer), std::size(buffer)};
        std::cout << "Erstellen des Vektors v...\n";
        std::pmr::vector
(Anmerkung: Der Text enthält ausschließlich C++-spezifische Begriffe und HTML-Tags, die gemäß den Anforderungen nicht übersetzt werden müssen. Daher bleibt die Ausgabe identisch mit der Eingabe.)<std::uint16_t> v{{1, 2, 3, 4}, &mem_res};
        std::cout << "v.data() @ " << v.data() << '\n'; // entspricht der `buffer`-Adresse
        std::cout << "Anfrage läuft...\n";
        for (int i{0}; i != push_back_limit; ++i)
        {
            v.push_back(i);
            std::cout << "v.size(): " << v.size() << '\n';
        }
        std::cout << "Verlasse Gültigkeitsbereich #2...\n";
    }
}

Mögliche Ausgabe:

Betreten von Bereich #1 (ohne Puffer auf dem Stack)...
Erstelle Vektor v...
+ Reserviere 8 Bytes @ 0x1f75c30
v.data() @ 0x1f75c30
Fordere mehr an...
+ Reserviere 16 Bytes @ 0x1f75c50
- Gebe 8 Bytes frei @ 0x1f75c30
v.size(): 5
v.size(): 6
v.size(): 7
v.size(): 8
+ Reserviere 32 Bytes @ 0x1f75c70
- Gebe 16 Bytes frei @ 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
+ Reserviere 64 Bytes @ 0x1f75ca0
- Gebe 32 Bytes frei @ 0x1f75c70
v.size(): 17
v.size(): 18
v.size(): 19
v.size(): 20
Verlasse Bereich #1...
- Gebe 64 Bytes frei @ 0x1f75ca0
Betreten von Bereich #2 (mit Puffer auf dem Stack)...
Reserviere Puffer auf dem Stack: 16 Bytes @ 0x7fffbe9f8240
Erstelle Vektor v...
v.data() @ 0x7fffbe9f8240
Fordere mehr an...
+ Reserviere 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
+ Reserviere 128 Bytes @ 0x1f75cf0
v.size(): 17
v.size(): 18
v.size(): 19
v.size(): 20
Verlasse Bereich #2...
- Gebe 128 Bytes frei @ 0x1f75cf0
- Gebe 64 Bytes frei @ 0x1f75ca0

Siehe auch

ruft die Standard- std::pmr::memory_resource ab
(Funktion)
gibt eine statische, programmweite std::pmr::memory_resource zurück, die den globalen operator new und operator delete zur Speicherallokation und -freigabe verwendet
(Funktion)