std::pmr:: set_default_resource
|
|
|||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
|
Definido en el 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 de recurso de memoria predeterminado a r ; de lo contrario, establece el puntero de recurso de memoria predeterminado a std:: pmr :: new_delete_resource ( ) .
El puntero de recurso de memoria predeterminado es utilizado por ciertas facilidades cuando no se suministra un recurso de memoria explícito. El puntero de recurso de memoria predeterminado inicial es el valor de retorno de std::pmr::new_delete_resource .
Esta función es segura para hilos. Cada llamada a
std::pmr::set_default_resource
se sincroniza con
(ver
std::memory_order
) las posteriores llamadas a
std::pmr::set_default_resource
y
std::pmr::get_default_resource
.
Valor de retorno
Devuelve el valor anterior del puntero de recurso de memoria predeterminado.
Ejemplo
#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 vector v...\n"; std::pmr::vector (Nota: El texto ya está en inglés técnico y no requiere traducción según las reglas especificadas)<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 en el ámbito #2 (con búfer en la pila)...\n"; std::uint8_t buffer[16]; std::cout << "Asignando búfer en 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 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"; } }
Salida posible:
Entrando al ámbito #1 (sin buffer en la pila)... Creando 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 buffer en la pila)... Asignando buffer en la pila: 16 bytes @ 0x7fffbe9f8240 Creando 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
Véase también
|
(C++17)
|
obtiene el recurso de memoria
std::pmr::memory_resource
predeterminado
(función) |
|
(C++17)
|
retorna un
std::pmr::memory_resource
estático de ámbito de programa que utiliza el
operator new
y
operator delete
global para asignar y liberar memoria
(función) |