Ottimizzare C++/Scrivere codice C++ efficiente/Allocazioni e deallocazioni: differenze tra le versioni
Contenuto cancellato Contenuto aggiunto
m Bot: Sostituzione automatica (-[[Categoria:Ottimizzare C++|Ottimizzare C++/Scrivere codice C++ efficiente/ +[[Categoria:Ottimizzare C++|) |
Nessun oggetto della modifica |
||
Riga 5:
Inoltre, tale tipo di allocazione comporta uno spreco di spazio per ogni allocazione, genera frammentazione della memoria virtuale, e produce una scarsa località dei dati, con conseguente scadente utilizzo sia delle cache dei dati della CPU che della memoria virtuale.
Tale allocazione/deallocazione veniva fatta in linguaggio C
In C++, pur essendo ancora disponibili tali funzioni, Ovviamente, un modo di ridurre le allocazioni è ridurre il numero di oggetti costruiti, e quindi la sezione
Tuttavia, qui si presenteranno
=== Array di lunghezza fissa ===
'''Se un array statico o non grande ha lunghezza costante, non usare un oggetto <code>vector</code>, ma usa un array del C, o un oggetto <code>
I <code>vector</code> memorizzano i dati in un buffer allocato dinamicamente, mentre le altre soluzioni proposte allocano i dati nell'oggetto stesso.
Questo consente di evitare allocazioni/deallocazioni di memoria dinamica e di favorire la località dei dati.
Line 24 ⟶ 25:
'''Se devi allocare numerosi blocchi di memoria della stessa dimensione, assicurati di usare un allocatore a blocchi.'''
Un [[w:en:Memory pool|''allocatore a blocchi'']] (detto anche ''allocatore a pool'') alloca blocchi di memoria medi o grandi, e fornisce servizi di allocazione/deallocazione di blocchi più piccoli di dimensione costante, offrendo alta velocità di allocazione/deallocazione, bassa frammentazione della memoria, uso efficiente delle cache dei dati e della memoria virtuale.
In particolare, un allocatore di questo tipo migliora notevolmente le prestazioni dei contenitori <code>std::list</code>, <code>std::set</code>, <code>std::multi_set</code>, <code>std::map</code>, e <code>std::multi_map</code>.
Line 32 ⟶ 33:
=== Aggiunta di elementi a collezione ===
'''
La funzione <code>push_back</code> garantisce un tempo lineare ammortizzato, in quanto, nel caso del <code>vector</code>, ingrandisce esponenzialmente la capacità.
Line 38 ⟶ 39:
La classe <code>back_inserter</code> chiama internamente la funzione <code>push_back</code>.
La funzione <code>insert</code> permette di inserire in modo ottimizzato un'intera sequenza, e quindi una sola chiamata di questo tipo è più veloce di numerose chiamate a <code>push_back</code>.
[[Categoria:Ottimizzare C++|Allocazioni e deallocazioni]]
{{Avanzamento|
|