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 KlasseT
und 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 FallT
Der 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ürT
s 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?