Namensräume
Varianten
Aktionen

std::scoped_allocator_adaptor

Von cppreference.com
< cpp‎ | memory
 
 
Speicherverwaltungsbibliothek
(nur Exposition*)
Algorithmen für uninitialisierten Speicher
(C++17)
(C++17)
(C++17)
Beschränkte uninitialisierte
Speicher-Algorithmen
C-Bibliothek

Allocatoren
scoped_allocator_adaptor
(C++11)
Speicherressourcen
Unterstützung für Garbage Collection
(C++11)(bis C++23)
(C++11)(bis C++23)
(C++11)(bis C++23)
(C++11)(bis C++23)
(C++11)(bis C++23)
(C++11)(bis C++23)
Uninitialisierter Speicher
Explizites Lebenszeitmanagement
 
 
Definiert in Header <scoped_allocator>
template< class OuterAlloc, class... InnerAllocs >

class scoped_allocator_adaptor

    : public OuterAlloc;
(seit C++11)

Die Klassenschablone std::scoped_allocator_adaptor ist ein Allokator, der mit mehrstufigen Containern (Vektor von Mengen von Listen von Tupeln von Maps usw.) verwendet werden kann. 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, wird der erste innere Allokator verwendet. Die Elemente dieses Containers, falls sie selbst Container sind, verwenden den zweiten inneren Allokator usw. Wenn die Verschachtelungstiefe des Containers größer ist als die Anzahl der inneren Allokatoren, wird der letzte innere Allokator für alle weiteren verschachtelten Container wiederverwendet.

Der Zweck dieses Adapters besteht darin, zustandsbehaftete Allokatoren in verschachtelten Containern korrekt zu initialisieren, z. B. wenn alle Ebenen eines verschachtelten Containers im selben gemeinsamen Speichersegment platziert werden müssen. Der Konstruktor des Adapters nimmt die Argumente für alle Allokatoren in der Liste entgegen, und jeder verschachtelte Container bezieht seinen Allokatorzustand bei Bedarf vom Adapter.

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

Die typische Implementierung hält eine Instanz eines std::scoped_allocator_adaptor<InnerAllocs...> als Mitgliedsobjekt.

Beachten Sie, dass std::pmr::polymorphic_allocators gemäß der Uses-Allocator-Konstruktion an verschachtelte Container weitergegeben werden und std::scoped_allocator_adaptor nicht benötigen (und nicht damit funktionieren).

Inhalt

[edit] Verschachtelte Typen

Typ Definition
outer_allocator_type OuterAlloc
inner_allocator_type
  • scoped_allocator_adaptor<OuterAlloc> falls sizeof...(InnerAllocs) null ist
  • scoped_allocator_adaptor<InnerAllocs...> sonst
value_type std::allocator_traits<OuterAlloc>::value_type
size_type std::allocator_traits<OuterAlloc>::size_type
difference_type std::allocator_traits<OuterAlloc>::difference_type
Zeiger 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

[edit] Member-Funktionen

erstellt ein neues scoped_allocator_adaptor-Objekt
(public member function) [edit]
destruiert ein scoped_allocator_adaptor-Objekt
(public member function) [edit]
weist einen scoped_allocator_adaptor zu
(public member function) [edit]
erhält eine Referenz auf den inner_allocator
(public member function) [edit]
erhält eine Referenz auf den outer_allocator
(public member function) [edit]
allokiert uninitialisierten Speicher unter Verwendung des äußeren Allokators
(public member function) [edit]
deallokiert Speicher unter Verwendung des äußeren Allokators
(public member function) [edit]
gibt die größte von dem äußeren Allokator unterstützte Allokationsgröße zurück
(public member function) [edit]
konstruiert ein Objekt im allokierten Speicher und übergibt bei Bedarf den inneren Allokator an dessen Konstruktor
(public member function) [edit]
destruiert ein Objekt im allokierten Speicher
(public member function) [edit]
kopiert den Zustand von scoped_allocator_adaptor und all seinen Allokatoren
(public member function) [edit]
Exposition-only Funktionale Templates
erhält den äußersten Allokator
(exposition-only Member-Funktion*)
konstruiert ein Objekt unter Verwendung des äußersten Allokators
(exposition-only Member-Funktion*)
zerstört ein Objekt unter Verwendung des äußersten Allokators
(exposition-only Member-Funktion*)

[edit] Nicht-Member-Funktionen

(in C++20 entfernt)
vergleicht zwei scoped_allocator_adaptor Objekte
(Funktionsschablone) [edit]

[edit] Deduktionsanleitungen(seit C++17)

[edit] Verschachtelte Klassen

Klasse Definition
rebind  template< class T >

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

[edit] 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);
 
    // create vector of vectors in shared memory
    ipc_matrix v(s.get_segment_manager());
 
    // for all these additions, the inner vectors obtain their allocator arguments
    // from the outer vector's scoped_allocator_adaptor
    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");
}

[edit] Defect reports

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 zu zeigen, ob scoped_allocator_adaptor zustandslos ist is_always_equal bereitgestellt

[edit] Siehe auch

liefert Informationen über Allocator-Typen
(Klassen-Template) [edit]
prüft, ob der angegebene Typ Uses-Allocator-Konstruktion unterstützt
(Klassen-Template) [edit]
der Standard-Allocator
(Klassen-Template) [edit]