2013-03-13 15 views
8

Stavo leggendo Why is there no reallocation functionality in C++ allocators? e Is it possible to create an array on the heap at run-time, and then allocate more space whenever needed?, che indicano chiaramente che la riallocazione di una matrice dinamica di oggetti è impossibile.Viene utilizzato un suggerimento di allocazione?

Tuttavia, in Il C++ standard libreria da Josuttis, si afferma un allocatore, allocator, ha una funzione allocate con la seguente sintassi

pointer allocator::allocate(size_type num, allocator<void>::pointer hint = 0) 

dove il hint ha un'implementazione significato definito, che può essere usato per aiutare a migliorare le prestazioni.

Esistono implementazioni che sfruttano questo?

risposta

1

C++ 11 stati, in 20.6.9.1 membri allocatore:

4 - [Note: In una funzione membro contenitore, l'indirizzo di un elemento adiacente è spesso una buona scelta per passare per l'argomento hint. - nota fine]
[...]
6 - [...] L'uso di hint non è specificato, ma inteso come ausilio per frazione se un'implementazione lo desidera.

L'assegnazione di nuovi elementi adiacenti o vicini a elementi esistenti nella memoria può aiutare le prestazioni migliorando la località; poiché di solito vengono memorizzati nella cache, gli elementi vicini tenderanno a viaggiare insieme nella gerarchia della memoria e non si sfrutteranno a vicenda.

+0

Ah, quindi è per allocare gli oggetti uno accanto all'altro piuttosto che riallocare un oggetto esistente? –

+0

Non puoi semplicemente passare il prossimo indirizzo disponibile. Il suggerimento deve essere stato ottenuto da una precedente chiamata a "allocare". – Potatoswatter

1

Non sono sicuro delle implementazioni specifiche, ma si noti che l'allocatore non è autorizzato a restituire il valore del puntatore del suggerimento prima che sia passato a deallocate. In modo che non può essere utilizzato come operazione primitiva per formare un reallocate.

Lo standard dice che il suggerimento deve essere stato restituito da una precedente chiamata a allocate. Dice "L'uso di [il suggerimento] non è specificato, ma è inteso come aiuto alla località". Pertanto, se si sta allocando e rilasciando una sequenza di blocchi di dimensioni simili su un thread, è possibile passare il valore precedentemente liberato per evitare la contesa della cache tra le cache dei microprocessori.

Altrimenti, quando la CPU B vede che stai usando gli indirizzi di memoria ancora nella cache della CPU A (anche quella memoria contiene oggetti che sono stati distrutti in base al C++), deve inoltrare i dati indesiderati sul bus. È meglio lasciare che CPU A e B riutilizzino i rispettivi indirizzi memorizzati nella cache.

2

Ho ottenuto notevoli vantaggi prestazionali per i tempi di iterazione su piccoli tipi scalari nel mio contenitore C++ plf::colony utilizzando hint con std :: allocator in Visual Studio 2010-2013 (velocità di iterazione aumentata di ~ 21%) e velocità notevolmente inferiori in GCC 5.1. Quindi è sicuro dire che con quei compilatori e std :: allocator, fa la differenza. Ma la differenza dipenderà dal compilatore. Non sono a conoscenza del rapporto tra l'ignoranza del suggerimento e gli allocatori che osservano il suggerimento.

Problemi correlati