Namespaces
Variants

std:: scoped_allocator_adaptor

From cppreference.net
Memory management library
( exposition only* )
Allocators
scoped_allocator_adaptor
(C++11)
Uninitialized memory algorithms
Constrained uninitialized memory algorithms
Memory resources
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 <scoped_allocator>
template < class OuterAlloc, class ... InnerAllocs >

class scoped_allocator_adaptor

: public OuterAlloc ;
(depuis C++11)

La classe template std::scoped_allocator_adaptor est un allocateur qui peut être utilisé avec des conteneurs multi-niveaux (vecteur d'ensembles de listes de tuples de maps, etc.). Elle est instanciée avec un type d'allocateur externe OuterAlloc et zéro ou plusieurs types d'allocateurs internes InnerAlloc... . Un conteneur construit directement avec un scoped_allocator_adaptor utilise OuterAlloc pour allouer ses éléments, mais si un élément est lui-même un conteneur, il utilise le premier allocateur interne. Les éléments de ce conteneur, s'ils sont eux-mêmes des conteneurs, utilisent le deuxième allocateur interne, etc. S'il y a plus de niveaux dans le conteneur que d'allocateurs internes, le dernier allocateur interne est réutilisé pour tous les conteneurs imbriqués supplémentaires.

L'objectif de cet adaptateur est d'initialiser correctement les allocateurs avec état dans les conteneurs imbriqués, par exemple lorsque tous les niveaux d'un conteneur imbriqué doivent être placés dans le même segment de mémoire partagée. Le constructeur de l'adaptateur prend les arguments pour tous les allocateurs dans la liste, et chaque conteneur imbriqué obtient l'état de son allocateu

Aux fins du scoped_allocator_adaptor , si le prochain allocateur interne est A , toute classe T pour laquelle std:: uses_allocator < T,A > :: value == true participe à la récursion comme s'il s'agissait d'un conteneur. De plus, std::pair est traité comme un tel conteneur par des surcharges spécifiques de scoped_allocator_adaptor::construct .

L'implémentation typique conserve une instance d'un std::scoped_allocator_adaptor<InnerAllocs...> comme objet membre.

Notez que std::pmr::polymorphic_allocator s se propagent aux conteneurs imbriqués selon la construction uses-allocator et n'ont pas besoin (et ne fonctionnent pas avec) std::scoped_allocator_adaptor .

Table des matières

Types imbriqués

Type Définition
outer_allocator_type OuterAlloc
inner_allocator_type
  • scoped_allocator_adaptor < OuterAlloc > si sizeof... ( InnerAllocs ) est zéro
  • scoped_allocator_adaptor < InnerAllocs... > sinon
value_type std:: allocator_traits < OuterAlloc > :: value_type
size_type std:: allocator_traits < OuterAlloc > :: size_type
difference_type std:: allocator_traits < OuterAlloc > :: difference_type
pointer std:: allocator_traits < OuterAlloc > :: pointer
const_pointer std:: allocator_traits < OuterAlloc > :: const_pointer
void_pointer std:: allocator_traits < OuterAlloc > :: void_pointer
const_void_pointer std:: allocator_traits < OuterAlloc > :: const_void_pointer


Étant donné l'ensemble de OuterAlloc et InnerAlloc... comme Allocs :

Type Définition
propagate_on_container_copy_assignment
propagate_on_container_move_assignment
propagate_on_container_swap
is_always_equal

Fonctions membres

crée un nouvel objet scoped_allocator_adaptor
(fonction membre publique)
détruit un objet scoped_allocator_adaptor
(fonction membre publique)
assigne un scoped_allocator_adaptor
(fonction membre publique)
obtient une référence inner_allocator
(fonction membre publique)
obtient une référence outer_allocator
(fonction membre publique)
alloue un stockage non initialisé en utilisant l'allocateur externe
(fonction membre publique)
désalloue le stockage en utilisant l'allocateur externe
(fonction membre publique)
retourne la taille d'allocation maximale supportée par l'allocateur externe
(fonction membre publique)
construit un objet dans le stockage alloué, en passant l'allocateur interne à son constructeur si approprié
(fonction membre publique)
détruit un objet dans le stockage alloué
(fonction membre publique)
copie l'état du scoped_allocator_adaptor et tous ses allocateurs
(fonction membre publique)
Modèles de fonctions d'exposition uniquement
obtient l'allocateur le plus externe
( fonction membre d'exposition uniquement* )
construit un objet en utilisant l'allocateur le plus externe
( fonction membre d'exposition uniquement* )
détruit un objet en utilisant l'allocateur le plus externe
( fonction membre d'exposition uniquement* )

Fonctions non membres

(supprimé en C++20)
compare deux objets scoped_allocator_adaptor
(modèle de fonction)

Guides de déduction (depuis C++17)

Classes imbriquées

Classe Définition
rebind template < class T >

struct rebind
{
using other = scoped_allocator_adaptor
< std:: allocator_traits < OuterAlloc > :: template rebind_alloc < T > ,
InnerAllocs... > ;
} ;

Exemple

#include <boost/interprocess/allocators/adaptive_pool.hpp>
#include <boost/interprocess/managed_shared_memory.hpp>
#include <scoped_allocator>
#include <vector>
namespace bi = boost::interprocess;
template<class T>
using alloc = bi::adaptive_pool<T, bi::managed_shared_memory::segment_manager>;
using ipc_row = std::vector<int, alloc<int>>;
using ipc_matrix = std::vector<ipc_row, std::scoped_allocator_adaptor<alloc<ipc_row>>>;
int main()
{
    bi::managed_shared_memory s(bi::create_only, "Demo", 65536);
    // créer un vecteur de vecteurs en mémoire partagée
    ipc_matrix v(s.get_segment_manager());
    // pour tous ces ajouts, les vecteurs internes obtiennent leurs arguments d'allocateur
    // depuis le scoped_allocator_adaptor du vecteur externe
    v.resize(1);
    v[0].push_back(1);
    v.emplace_back(2);
    std::vector<int> local_row = {1, 2, 3};
    v.emplace_back(local_row.begin(), local_row.end());
    bi::shared_memory_object::remove("Demo");
}

Rapports de défauts

Les rapports de défauts modifiant le comportement suivants ont été appliqués rétroactivement aux normes C++ précédemment publiées.

DR Appliqué à Comportement publié Comportement corrigé
LWG 2108 C++11 il n'y avait aucun moyen de montrer si scoped_allocator_adaptor est sans état fourni is_always_equal

Voir aussi

fournit des informations sur les types d'allocateur
(modèle de classe)
vérifie si le type spécifié prend en charge la construction avec allocateur
(modèle de classe)
l'allocateur par défaut
(modèle de classe)