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)
Definiert in Header <scoped_allocator>
template < class OuterAlloc, class ... InnerAllocs >

class scoped_allocator_adaptor

: public OuterAlloc ;
(seit C++11)

Die std::scoped_allocator_adaptor -Klassentemplate ist ein Allokator, der mit mehrstufigen Containern verwendet werden kann (Vektor von Sets von Listen von Tupeln von Maps, etc.). Sie wird mit einem äußeren Allokatortyp OuterAlloc und null oder mehr inneren Allokatortypen InnerAlloc... instanziiert. Ein Container, der direkt mit einem scoped_allocator_adaptor konstruiert wird, verwendet OuterAlloc zur Allokation seiner Elemente, aber wenn ein Element selbst ein Container ist, verwendet es den ersten inneren Allokator. Die Elemente dieses Containers, falls sie selbst Container sind, verwenden den zweiten inneren Allokator, usw. Wenn es mehr Ebenen im Container als innere Allokatoren gibt, wird der letzte innere Allokator für alle weiteren verschachtelten Container wiederverwendet.

Der Zweck dieses Adapters ist die korrekte Initialisierung zustandsbehafteter Allokatoren in geschachtelten Containern, beispielsweise wenn alle Ebenen eines geschachtelten Containers im selben Shared-Memory-Segment platziert werden müssen. Der Konstruktor des Adapters nimmt die Argumente für alle Allokatoren in der Liste entgegen, und jeder geschachtelte Container bezieht den Zustand seines Allokators bei Bedarf vom Adapter.

Für den Zweck von scoped_allocator_adaptor , wenn der nächste innere Allokator A ist, nimmt jede Klasse T , für die std:: uses_allocator < T,A > :: value == true an der Rekursion teil, als ob sie ein Container wäre. Zusätzlich wird std::pair durch spezifische Überladungen von scoped_allocator_adaptor::construct als ein solcher Container behandelt.

Typische Implementierungen halten eine Instanz eines std::scoped_allocator_adaptor<InnerAllocs...> als Mitgliedsobjekt.

Beachten Sie, dass std::pmr::polymorphic_allocator s gemäß Uses-allocator-Konstruktion zu verschachtelten Containern propagieren und std::scoped_allocator_adaptor nicht benötigen (und nicht damit funktionieren).

Inhaltsverzeichnis

Verschachtelte Typen

Typ Definition
outer_allocator_type OuterAlloc
inner_allocator_type
  • scoped_allocator_adaptor < OuterAlloc > falls sizeof... ( InnerAllocs ) null ist
  • scoped_allocator_adaptor < InnerAllocs... > andernfalls
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


Gegeben die Menge von OuterAlloc und InnerAlloc... als Allocs :

Typ Definition
propagate_on_container_copy_assignment
propagate_on_container_move_assignment
propagate_on_container_swap
is_always_equal

Memberfunktionen

erstellt ein neues scoped_allocator_adaptor Objekt
(öffentliche Elementfunktion)
zerstört ein scoped_allocator_adaptor Objekt
(öffentliche Elementfunktion)
weist einen scoped_allocator_adaptor zu
(öffentliche Elementfunktion)
erhält eine inner_allocator Referenz
(öffentliche Elementfunktion)
erhält eine outer_allocator Referenz
(öffentliche Elementfunktion)
allokiert nicht initialisierten Speicher mit dem äußeren Allokator
(öffentliche Elementfunktion)
gibt Speicher mit dem äußeren Allokator frei
(öffentliche Elementfunktion)
gibt die größte vom äußeren Allokator unterstützte Allokationsgröße zurück
(öffentliche Elementfunktion)
konstruiert ein Objekt im allokierten Speicher und übergibt den inneren Allokator an seinen Konstruktor falls zutreffend
(öffentliche Elementfunktion)
zerstört ein Objekt im allokierten Speicher
(öffentliche Elementfunktion)
kopiert den Zustand von scoped_allocator_adaptor und all seiner Allokatoren
(öffentliche Elementfunktion)
Nur zur Darstellung dienende Funktionsvorlagen
erhält den äußersten Allokator
( nur zur Darstellung dienende Elementfunktion* )
konstruiert ein Objekt mit dem äußersten Allokator
( nur zur Darstellung dienende Elementfunktion* )
zerstört ein Objekt mit dem äußersten Allokator
( nur zur Darstellung dienende Elementfunktion* )

Nicht-Member-Funktionen

(entfernt in C++20)
vergleicht zwei scoped_allocator_adaptor Objekte
(Funktions-Template)

Deduction guides (seit C++17)

Geschachtelte Klassen

Klasse Definition
rebind template < class T >

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

Beispiel

#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);
    // Vektor von Vektoren im Shared Memory erstellen
    ipc_matrix v(s.get_segment_manager());
    // Für alle diese Erweiterungen erhalten die inneren Vektoren ihre Allokator-Argumente
    // vom scoped_allocator_adaptor des äußeren Vektors
    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");
}

Fehlerberichte

Die folgenden verhaltensändernden Fehlerberichte wurden rückwirkend auf zuvor veröffentlichte C++-Standards angewendet.

DR Angewendet auf Verhalten wie veröffentlicht Korrigiertes Verhalten
LWG 2108 C++11 Es gab keine Möglichkeit festzustellen, ob scoped_allocator_adaptor zustandslos ist Bereitstellung von is_always_equal

Siehe auch

stellt Informationen über Allocator-Typen bereit
(Klassen-Template)
prüft, ob der angegebene Typ Uses-Allocator-Konstruktion unterstützt
(Klassen-Template)
der Standard-Allocator
(Klassen-Template)