std:: scoped_allocator_adaptor
|
Défini dans l'en-tête
<scoped_allocator>
|
||
|
template
<
class
OuterAlloc,
class
...
InnerAllocs
>
class
scoped_allocator_adaptor
|
(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
|
|
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
|
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
|
(C++11)
|
fournit des informations sur les types d'allocateur
(modèle de classe) |
|
(C++11)
|
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) |