Namespaces
Variants

Standard library header <memory_resource> (C++17)

From cppreference.net
Standard library headers

Table des matières

Classes

Défini dans l'espace de noms std::pmr
un allocateur qui prend en charge le polymorphisme à l'exécution basé sur le std::pmr::memory_resource avec lequel il est construit
(modèle de classe)
une interface abstraite pour les classes qui encapsulent les ressources mémoire
(classe)
un ensemble d'options de constructeur pour les ressources de pool
(classe)
un std::pmr::memory_resource thread-safe pour gérer les allocations dans des pools de différentes tailles de blocs
(classe)
un std::pmr::memory_resource non thread-safe pour gérer les allocations dans des pools de différentes tailles de blocs
(classe)
un std::pmr::memory_resource à usage spécial qui libère la mémoire allouée uniquement lorsque la ressource est détruite
(classe)

Fonctions

Défini dans l'espace de noms std::pmr
retourne un std::pmr::memory_resource statique à l'échelle du programme qui utilise les opérateur new et opérateur delete globaux pour allouer et libérer la mémoire
(fonction)
retourne un std::pmr::memory_resource statique qui n'effectue aucune allocation
(fonction)
obtient le std::pmr::memory_resource par défaut
(fonction)
définit le std::pmr::memory_resource par défaut
(fonction)

Synopsis

namespace std::pmr {
  // classe memory_resource
  class memory_resource;
  bool operator==(const memory_resource& a, const memory_resource& b) noexcept;
  // classe template polymorphic_allocator
  template<class Tp> class polymorphic_allocator;
  template<class T1, class T2>
    bool operator==(const polymorphic_allocator<T1>& a,
                    const polymorphic_allocator<T2>& b) noexcept;
  // ressources mémoire globales
  memory_resource* new_delete_resource() noexcept;
  memory_resource* null_memory_resource() noexcept;
  memory_resource* set_default_resource(memory_resource* r) noexcept;
  memory_resource* get_default_resource() noexcept;
  // classes de ressources de pool
  struct pool_options;
  class synchronized_pool_resource;
  class unsynchronized_pool_resource;
  class monotonic_buffer_resource;
}

Classe std::pmr::memory_resource

namespace std::pmr {
  class memory_resource {
    static constexpr size_t max_align = alignof(max_align_t);   // exposition uniquement
  public:
    memory_resource() = default;
    memory_resource(const memory_resource&) = default;
    virtual ~memory_resource();
    memory_resource& operator=(const memory_resource&) = default;
    void* allocate(size_t bytes, size_t alignment = max_align);
    void deallocate(void* p, size_t bytes, size_t alignment = max_align);
    bool is_equal(const memory_resource& other) const noexcept;
  private:
    virtual void* do_allocate(size_t bytes, size_t alignment) = 0;
    virtual void do_deallocate(void* p, size_t bytes, size_t alignment) = 0;
    virtual bool do_is_equal(const memory_resource& other) const noexcept = 0;
  };
}

Modèle de classe std::pmr::polymorphic_allocator

namespace std::pmr {
  template<class Tp = byte> class polymorphic_allocator {
    memory_resource* memory_rsrc;       // exposition uniquement
  public:
    using value_type = Tp;
    // constructeurs
    polymorphic_allocator() noexcept;
    polymorphic_allocator(memory_resource* r);
    polymorphic_allocator(const polymorphic_allocator& other) = default;
    template<class U>
      polymorphic_allocator(const polymorphic_allocator<U>& other) noexcept;
    polymorphic_allocator& operator=(const polymorphic_allocator&) = delete;
    // fonctions membres
    Tp* allocate(size_t n);
    void deallocate(Tp* p, size_t n);
    void* allocate_bytes(size_t nbytes, size_t alignment = alignof(max_align_t));
    void deallocate_bytes(void* p, size_t nbytes, size_t alignment = alignof(max_align_t));
    template<class T> T* allocate_object(size_t n = 1);
    template<class T> void deallocate_object(T* p, size_t n = 1);
    template<class T, class... CtorArgs>
      T* new_object(CtorArgs&&... ctor_args);
    template<class T> void delete_object(T* p);
    template<class T, class... Args>
      void construct(T* p, Args&&... args);
    template<class T>
      void destroy(T* p); // obsolète
    polymorphic_allocator select_on_container_copy_construction() const;
    memory_resource* resource() const;
  };
}

Classe std::pmr::pool_options

namespace std::pmr {
  struct pool_options {
    size_t max_blocks_per_chunk = 0;
    size_t largest_required_pool_block = 0;
  };
}
**Note:** Le code C++ n'a pas été traduit car il se trouve dans des balises `
` et contient des termes spécifiques au C++ qui doivent être préservés selon les instructions. Seul le texte environnant aurait été traduit s'il y en avait eu.

Classe std::pmr::synchronized_pool_resource

namespace std::pmr {
  class synchronized_pool_resource : public memory_resource {
  public:
    synchronized_pool_resource(const pool_options& opts, memory_resource* upstream);
    synchronized_pool_resource()
        : synchronized_pool_resource(pool_options(), get_default_resource()) {}
    explicit synchronized_pool_resource(memory_resource* upstream)
        : synchronized_pool_resource(pool_options(), upstream) {}
    explicit synchronized_pool_resource(const pool_options& opts)
        : synchronized_pool_resource(opts, get_default_resource()) {}
    synchronized_pool_resource(const synchronized_pool_resource&) = delete;
    virtual ~synchronized_pool_resource();
    synchronized_pool_resource& operator=(const synchronized_pool_resource&) = delete;
    void release();
    memory_resource* upstream_resource() const;
    pool_options options() const;
  protected:
    void* do_allocate(size_t bytes, size_t alignment) override;
    void do_deallocate(void* p, size_t bytes, size_t alignment) override;
    bool do_is_equal(const memory_resource& other) const noexcept override;
  };
}

Classe std::pmr::unsynchronized_pool_resource

namespace std::pmr {
  class unsynchronized_pool_resource : public memory_resource {
  public:
    unsynchronized_pool_resource(const pool_options& opts, memory_resource* upstream);
    unsynchronized_pool_resource()
        : unsynchronized_pool_resource(pool_options(), get_default_resource()) {}
    explicit unsynchronized_pool_resource(memory_resource* upstream)
        : unsynchronized_pool_resource(pool_options(), upstream) {}
    explicit unsynchronized_pool_resource(const pool_options& opts)
        : unsynchronized_pool_resource(opts, get_default_resource()) {}
    unsynchronized_pool_resource(const unsynchronized_pool_resource&) = delete;
    virtual ~unsynchronized_pool_resource();
    unsynchronized_pool_resource& operator=(const unsynchronized_pool_resource&) = delete;
    void release();
    memory_resource* upstream_resource() const;
    pool_options options() const;
  protected:
    void* do_allocate(size_t bytes, size_t alignment) override;
    void do_deallocate(void* p, size_t bytes, size_t alignment) override;
    bool do_is_equal(const memory_resource& other) const noexcept override;
  };
}

Classe std::pmr::monotonic_buffer_resource

namespace std::pmr {
  class monotonic_buffer_resource : public memory_resource {
    memory_resource* upstream_rsrc;     // exposition uniquement
    void* current_buffer;               // exposition uniquement
    size_t next_buffer_size;            // exposition uniquement
  public:
    explicit monotonic_buffer_resource(memory_resource* upstream);
    monotonic_buffer_resource(size_t initial_size, memory_resource* upstream);
    monotonic_buffer_resource(void* buffer, size_t buffer_size, memory_resource* upstream);
    monotonic_buffer_resource()
      : monotonic_buffer_resource(get_default_resource()) {}
    explicit monotonic_buffer_resource(size_t initial_size)
      : monotonic_buffer_resource(initial_size, get_default_resource()) {}
    monotonic_buffer_resource(void* buffer, size_t buffer_size)
      : monotonic_buffer_resource(buffer, buffer_size, get_default_resource()) {}
    monotonic_buffer_resource(const monotonic_buffer_resource&) = delete;
    virtual ~monotonic_buffer_resource();
    monotonic_buffer_resource& operator=(const monotonic_buffer_resource&) = delete;
    void release();
    memory_resource* upstream_resource() const;
  protected:
    void* do_allocate(size_t bytes, size_t alignment) override;
    void do_deallocate(void* p, size_t bytes, size_t alignment) override;
    bool do_is_equal(const memory_resource& other) const noexcept override;
  };
}