Erneutes Binden in einem benutzerdefinierten AWL-Allokator mit vorab zugewiesenem Block

Ich werde eine bauenbenutzerdefinierte Zuweisung, Vorbelegung eines großen Blocks (Arrays) zum SpeichernN Elemente einer KlasseTund erhöhen Sie dann einfach einen Index innerhalb des Arrays, um Anforderungen für die Dienstzuordnung zu erhalten.

Seit ichnicht Wenn Sie eine Initialisierung für die Elemente im vorab zugewiesenen Block wünschen, funktioniert Folgendes nicht:

T buffer[N];

denn in diesem FallTDer Konstruktor von wird für die aufgerufenN Elemente des Blocks.

Da ist mein Verständnis dasstd::aligned_storage ruft nicht anT's Konstruktor, dachte ich mitstd::aligned_storage, etwas wie das:

std::aligned_storage<
    N * sizeof(T),
    std::alignment_of<T>::value 
>::type buffer;

T* base = static_cast<T*>( static_cast<void*>(&buffer) );

Und dann kann der Allokator nur den Basiszeiger inkrementieren, wenn eine Allokation für ein T angefordert wird (bis(base+N)), und T kann konstruiert werdenan Ort und Stelle (mit Platzierungnew) wenn gebraucht.

Ich möchte dieses Schema verwenden, um a zu definierenbenutzerdefinierte Zuweisung für AWL-Container. Mir scheint jedoch, dass es hier ein Problem geben könnteerneut binden. Nach meinem Verständnis sollte ein AWL-Zuweiser das erneute Binden von einem Typ unterstützenT zu einem TypU, z.B. weil behälter mögenstd::list<T> (oder andere knotenbasierte Container wiestd::map) Verwenden Sie Allokatoren zum AllokierenKnoten das sind eigentlich keine typenT, aber von anderer ArtU (enthältT und andere "Header" -Overhead-Informationen für den Knoten). Also, würde das vorgenanntestd::aligned_storage Ansatz gut zum Nachbinden? Oder (wie ich finde) eine korrekte Ausrichtung fürTs machtnicht implizieren eine korrekte Ausrichtung für einen anderen TypU?

Wie könnte dieses Problem gelöst werden?

Wie könnte ich das oben Genannte definieren?buffer damit es auch funktioniert, wenn Sie zu einem anderen Typ zurückkehrenU?

Sollte dieses Problem aus einer anderen Perspektive angegriffen werden? Wenn ja, was?

Antworten auf die Frage(1)

Ihre Antwort auf die Frage