Ich werde einen benutzerdefinierten Zuordner, preallocating einen großen Block (Array) zum Speichern von N
Elementen einer Klasse T
, bauen und dann erhöhe nur einen Index innerhalb der Array für Servicezuweisungsanfragen.Rebinding in einem benutzerdefinierten STL Zuordner mit vorab zugewiesenen Block
Da ich nicht für die Elemente jeder Initialisierung wollen im Voraus zugewiesenen Block, so etwas wie das wird nicht funktionieren:
T buffer[N];
, weil in diesem Fall T
‚s Konstruktor wird aufgerufen für die N
Elemente des Blocks.
Da mein Verständnis ist, dass std::aligned_storage
nicht T
‚s Konstruktor nicht nennen, dachte ich an std::aligned_storage
verwenden, etwa so:
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 Zuordner nur den Basiszeiger erhöht werden, wenn eine Zuweisung für ein T wird angefordert (bis (base+N)
), und T kann an Ort und Stelle (mit Platzierung new
) bei Bedarf gebaut werden.
Ich möchte dieses Schema verwenden, um eine benutzerdefinierte Zuordnung für STL-Container zu definieren. Es scheint mir jedoch, dass es hier ein Problem für geben könnte, das wiederverbindet. Wenn mein Verständnis korrekt ist, sollte ein STL-Zuordner tatsächlich eine erneute Bindung von einem Typ T
an einen Typ U
unterstützen, z. weil Container wie std::list<T>
(oder einem anderen Knoten basierende Behälter wie std::map
) verwenden Verteilern Knoten, die nicht tatsächlich vom Typ T
, aber von einem anderen Typ U
(enthaltend T
und andere „header“ Overhead-Information für den Knoten) zuzuteilen. Also, würde die oben genannte std::aligned_storage
Ansatz gut für die erneute Bindung funktionieren? Oder (wie ich denke) eine korrekte Ausrichtung für T
s tut nicht implizieren eine korrekte Ausrichtung für einen anderen anderen Typ U
?
Wie könnte dieses Problem gelöst werden?
Wie könnte ich die oben genannten buffer
definieren, damit es auch für das erneute Binden an einen anderen Typ U
funktioniert?
Sollte dieses Problem aus einer anderen Perspektive angegriffen werden? Wenn ja, was?
Können Sie nicht einfach 'std :: alignment_of :: value' verwenden, damit es für jeden von den C++ - Standardzuordnern unterstützten Typ richtig ausgerichtet wird? Natürlich wird dies nicht für Typen mit speziellen (strengeren) Ausrichtungsanforderungen funktionieren (bestes Beispiel SSE), aber diese sind am Ende immer ein Problem, selbst für die Standardzuordner. –