std::pmr::set_default_resource
De cppreference.com
Definido en el archivo de encabezado <memory_resource>
|
||
std::pmr::memory_resource* set_default_resource(std::pmr::memory_resource* r) noexcept; |
(desde C++17) | |
Si r
no es nulo, establece el puntero del recurso de memoria por defecto en r
; de lo contrario, establece el puntero del recurso de memoria por defecto en std::pmr::new_delete_resource().
El puntero del recurso de memoria por defecto se utiliza por ciertos servicios cuando no se proporciona un recurso de memoria explícito. El puntero inicial del recurso de memoria por defecto es el valor de retorno de std::pmr::new_delete_resource.
Esta función es segura frente a hilos. Toda llamada a std::pmr::set_default_resource
se sincroniza con (véase std::memory_order) las llamadas posteriores a std::pmr::set_default_resource
y std::pmr::get_default_resource.
[editar] Valor de retorno
Devuelve el valor anterior del puntero del recurso de memoria por defecto.
[editar] Ejemplo
Ejecuta este código
#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 << "+ Asignando " << 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 << "- Desasignando " << 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 << "Entrando al ámbito #1 (sin búfer en la pila)...\n"; std::cout << "Creando el vector v...\n"; std::pmr::vector<std::uint16_t> v{ {1, 2, 3, 4} }; std::cout << "v.data() @ " << v.data() << '\n'; std::cout << "Solicitando más...\n"; for (int i{0}; i != push_back_limit; ++i) { v.push_back(i); std::cout << "v.size(): " << v.size() << '\n'; } std::cout << "Saliendo del ámbito #1...\n"; } std::cout << '\n'; { std::cout << "Entrando al ámbito #2 (con búfer en la pila)...\n"; std::uint8_t buffer[16]; std::cout << "Asignando búfer en la pila: " << sizeof buffer << " bytes @ " << static_cast<void*>(buffer) << '\n'; std::pmr::monotonic_buffer_resource mem_res{std::data(buffer), std::size(buffer)}; std::cout << "Creando el vector v...\n"; std::pmr::vector<std::uint16_t> v{ {1, 2, 3, 4}, &mem_res }; std::cout << "v.data() @ " << v.data() << '\n'; // igual a la dirección de `buffer` std::cout << "Solicitando más...\n"; for (int i{0}; i != push_back_limit; ++i) { v.push_back(i); std::cout << "v.size(): " << v.size() << '\n'; } std::cout << "Saliendo del ámbito #2...\n"; } }
Posible salida:
Entrando al ámbito #1 (sin búfer en la pila)... Creando el vector v... + Asignando 8 bytes @ 0x1f75c30 v.data() @ 0x1f75c30 Solicitando más... + Asignando 16 bytes @ 0x1f75c50 - Desasignando 8 bytes @ 0x1f75c30 v.size(): 5 v.size(): 6 v.size(): 7 v.size(): 8 + Asignando 32 bytes @ 0x1f75c70 - Desasignando 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 + Asignando 64 bytes @ 0x1f75ca0 - Desasignando 32 bytes @ 0x1f75c70 v.size(): 17 v.size(): 18 v.size(): 19 v.size(): 20 Saliendo del ámbito #1... - Desasignando 64 bytes @ 0x1f75ca0 Entrando al ámbito #2 (con búfer en la pila)... Asignando búfer en la pila: 16 bytes @ 0x7fffbe9f8240 Creando el vector v... v.data() @ 0x7fffbe9f8240 Solicitando más... + Asignando 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 + Asignando 128 bytes @ 0x1f75cf0 v.size(): 17 v.size(): 18 v.size(): 19 v.size(): 20 Saliendo del ámbito #2... - Desasignando 128 bytes @ 0x1f75cf0 - Desasignando 64 bytes @ 0x1f75ca0
[editar] Véase también
(C++17) |
Obtiene el recurso de memoria std::pmr::memory_resource por defecto. (función) |
(C++17) |
Devuelve un recurso de memoria std::pmr::memory_resource estático a lo largo del programa que utiliza los operadores globales operator new y operator delete para asignar y desasignar memoria. (función) |