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)
Défini dans l'en-tête <memory_resource>
std:: pmr :: memory_resource * set_default_resource ( std:: pmr :: memory_resource * r ) noexcept ;
(depuis C++17)

Si r n'est pas nul, définit le pointeur de ressource mémoire par défaut à r ; sinon, définit le pointeur de ressource mémoire par défaut à std:: pmr :: new_delete_resource ( ) .

Le pointeur de ressource mémoire par défaut est utilisé par certaines fonctionnalités lorsqu'une ressource mémoire explicite n'est pas fournie. Le pointeur de ressource mémoire par défaut initial est la valeur de retour de std::pmr::new_delete_resource .

Cette fonction est sûre dans un contexte multithread. Chaque appel à std::pmr::set_default_resource se synchronise avec (voir std::memory_order ) les appels ultérieurs à std::pmr::set_default_resource et std::pmr::get_default_resource .

Valeur de retour

Retourne la valeur précédente du pointeur de ressource mémoire par défaut.

Exemple

#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 << "+ Allocation " << bytes << " octets @ ";
        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 << "- Désallocation de " << bytes << " octets @ " << 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 << "Entrée dans la portée #1 (sans tampon sur la pile)...\n";
        std::cout << "Création du vecteur v...\n";
        std::pmr::vector<std::uint16_t> v{1, 2, 3, 4};
        std::cout << "v.data() @ " << v.data() << '\n';
        std::cout << "Demande de plus...\n";
        for (int i{0}; i != push_back_limit; ++i)
        {
            v.push_back(i);
            std::cout << "v.size(): " << v.size() << '\n';
        }
        std::cout << "Sortie de la portée #1...\n";
    }
    std::cout << '\n';
    {
        std::cout << "Entrée dans la portée #2 (avec tampon sur la pile)...\n";
        std::uint8_t buffer[16];
        std::cout << "Allocation du tampon sur la pile : " << sizeof buffer << " octets @ "
                  << static_cast<void*>(buffer) << '\n';
        std::pmr::monotonic_buffer_resource mem_res{std::data(buffer), std::size(buffer)};
        std::cout << "Création du vecteur v...\n";
        std::pmr::vector<std::uint16_t> v{{1, 2, 3, 4}, &mem_res};
        std::cout << "v.data() @ " << v.data() << '\n'; // égal à l'adresse de `buffer`
        std::cout << "Demande de plus...\n";
        for (int i{0}; i != push_back_limit; ++i)
        {
            v.push_back(i);
            std::cout << "v.size(): " << v.size() << '\n';
        }
        std::cout << "Sortie de la portée #2...\n";
    }
}

Sortie possible :

Entrée dans la portée #1 (sans tampon sur la pile)...
Création du vecteur v...
+ Allocation de 8 octets @ 0x1f75c30
v.data() @ 0x1f75c30
Demande supplémentaire...
+ Allocation de 16 octets @ 0x1f75c50
- Désallocation de 8 octets @ 0x1f75c30
v.size(): 5
v.size(): 6
v.size(): 7
v.size(): 8
+ Allocation de 32 octets @ 0x1f75c70
- Désallocation de 16 octets @ 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
+ Allocation de 64 octets @ 0x1f75ca0
- Désallocation de 32 octets @ 0x1f75c70
v.size(): 17
v.size(): 18
v.size(): 19
v.size(): 20
Sortie de la portée #1...
- Désallocation de 64 octets @ 0x1f75ca0
Entrée dans la portée #2 (avec tampon sur la pile)...
Allocation du tampon sur la pile : 16 octets @ 0x7fffbe9f8240
Création du vecteur v...
v.data() @ 0x7fffbe9f8240
Demande supplémentaire...
+ Allocation de 64 octets @ 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
+ Allocation de 128 octets @ 0x1f75cf0
v.size(): 17
v.size(): 18
v.size(): 19
v.size(): 20
Sortie de la portée #2...
- Désallocation de 128 octets @ 0x1f75cf0
- Désallocation de 64 octets @ 0x1f75ca0

Voir aussi

obtient la ressource mémoire par défaut std::pmr::memory_resource
(fonction)
retourne une ressource mémoire statique à l'échelle du programme std::pmr::memory_resource qui utilise l' operator new global et l' operator delete pour allouer et libérer la mémoire
(fonction)