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)
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

obtiene el recurso de memoria std::pmr::memory_resource predeterminado
(función)
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)