Sto per costruire un allocatore personalizzato , preallocare un grosso blocco (array) per memorizzare N
elementi di qualche classe T
, e poi basta aumentare un indice all'interno array per soddisfare le richieste di allocazione.ricollegamento in un allocatore STL personalizzato con preassegnati blocco
Dal momento che Non vogliono alcuna inizializzazione per gli elementi nel blocco pre-assegnati, qualcosa come questo non funziona:
T buffer[N];
perché in questo caso s' T
sarà chiamato costruttore per gli elementi N
del blocco.
Dal momento che la mia comprensione è che std::aligned_storage
non chiama il costruttore T
s', ho pensato di usare std::aligned_storage
, qualcosa di simile:
std::aligned_storage<
N * sizeof(T),
std::alignment_of<T>::value
>::type buffer;
T* base = static_cast<T*>(static_cast<void*>(&buffer));
E poi l'allocatore può solo incrementare il puntatore base quando una dotazione per a T è richiesto (fino a (base+N)
), e T può essere costruito sul posto (con il posizionamento new
) quando necessario.
Vorrei utilizzare questo schema per definire un allocatore personalizzato per i contenitori STL. Tuttavia, mi sembra che potrebbe esserci un problema qui per che ricongiunge. In effetti, se la mia comprensione è corretta, un allocatore STL dovrebbe supportare il rifacimento da un tipo T
a un tipo U
, ad es. perché contenitori come std::list<T>
(o altri contenitori nodo-based come std::map
) utilizzano allocatori allocare nodi che non sono effettivamente di tipo T
, ma di diverso tipo U
(contenente T
e altri "header" informazioni overhead per il nodo). Quindi, il suddetto approccio std::aligned_storage
funziona bene per il riavvolgimento? O (come penso) un allineamento corretto per T
s non implica un allineamento corretto per un altro tipo diverso U
?
Come si può risolvere questo problema?
Come potrei definire il sopracitato buffer
per farlo funzionare anche per il rifasamento di un tipo diverso U
?
Questo problema può essere attaccato da una prospettiva diversa? E allora?
Non puoi semplicemente usare 'std :: alignment_of :: value' invece, per renderlo correttamente allineato per qualsiasi tipo supportato dagli assegnatori standard C++? Ovviamente questo non funzionerà per i tipi con requisiti di allineamento speciali (più rigorosi) (esempio migliore SSE), ma quelli sono alla fine sempre un problema, anche per gli allocatori standard. –