std::pmr:: set_default_resource
|
|
|||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
|
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
|
(C++17)
|
ruft die Standard-
std::pmr::memory_resource
ab
(Funktion) |
|
(C++17)
|
gibt eine statische, programmweite
std::pmr::memory_resource
zurück, die den globalen
operator new
und
operator delete
zur Speicherallokation und -freigabe verwendet
(Funktion) |