Ottimizzare C++/Scrivere codice C++ efficiente/Allocazioni e deallocazioni: differenze tra le versioni
Contenuto cancellato Contenuto aggiunto
Riportate modifiche da en.wikibooks |
|||
Riga 1:
{{Ottimizzare C++}}
L'allocazione e la deallocazione dinamiche di memoria
In altre parole, lo ''heap'' è molto più lento dello ''stack''.
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
In C++, pur essendo ancora disponibili tali funzioni, normalmente a tale scopo si usano gli operatori <code>new</code>, <code>new[]</code>, <code>delete</code>, e <code>delete[]</code>.
Line 14 ⟶ 15:
=== Array di lunghezza fissa ===
'''Se un array statico o non grande ha lunghezza costante,
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.
Se l'array è
=== Allocatore a blocchi ===
Line 25 ⟶ 26:
'''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
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 35 ⟶ 36:
'''Quando aggiungi elementi in fondo a una collezione, usa <code>push_back</code> per aggiungere un singolo elemento, usa <code>insert</code> per aggiungere una sequenza, e usa <code>back_inserter</code> per fare in modo che un algoritmo STL aggiunga elementi a una sequenza.'''
La funzione <code>push_back</code> garantisce un tempo lineare ammortizzato, in quanto, nel caso
La classe <code>back_inserter</code> chiama internamente la funzione <code>push_back</code>.
|