Ottimizzare C++/Scrivere codice C++ efficiente/Accesso alla memoria: differenze tra le versioni

Contenuto cancellato Contenuto aggiunto
RamaccoloBot (discussione | contributi)
m Bot: Sostituzione automatica (-[[Categoria:Ottimizzare C++|Ottimizzare C++/Scrivere codice C++ efficiente/ +[[Categoria:Ottimizzare C++|)
Nessun oggetto della modifica
Riga 1:
{{Ottimizzare C++}}
 
Questa sezione presenta le linee-guida per migliorare le prestazioni di accesso alla memoria principale, facendo buon uso delle memorie cache del processore, e dello swapping su hard disk del gestore di memoria virtuale del sistema operativo.
 
=== Ordine di accesso alla memoria ===
 
'''Accedi alla memoria in ordine crescente;. inIn particolare,:
* '''scandisci gli array in ordine crescente,;'''
* '''scandisci gli array multidimensionali usando gli indice più a destra per i cicli più interni,;'''
* '''nei costruttori delle classi e negli operatori di assegnamento (<code>operator=</code>) accedi alle variabili membro nell'ordine in cui sono dichiarate nella classe.'''
 
La cache dei dati ottimizza gli accessi alla memoria in ordine sequenziale crescente.

Quando si itera su un array multidimensionale, il loop più interno deve iterare sull'ultimo indice. In tal modo, è garantito che le celle vengono elaborate nell’ordinenell'ordine in cui si trovano in memoria. Per esempio:
 
<source lang=cpp>
float a[num_livelli][num_righe][num_colonne];
for (int liv = 0; liv < num_livelli; ++ liv) {
for (int r = 0; r < num_righe; ++r) {
for (int c = 0; c < num_colonne; ++c) {
Line 25 ⟶ 30:
 
I compilatori attivano di default un criterio di allineamento dei tipi fondamentali, per cui le variabili di ogni tipo possono iniziare solo a determinati indirizzi di memoria.
Tale criterio solitamente garantisce le massime prestazioni, ma può introdurre degli spazi inutilizzati tra le variabili.
Se per alcune strutture è necessario eliminare tali spazi, usa le direttiva ''pragma'' per confinare tale impaccamento alle sole strutture per cui è necessario.
 
=== Raggruppamento di funzioni in unità di compilazione ===
 
'''Definisci nella stessa unità di compilazione tutte le funzioni membro di una classe, le funzioni <code>friend</code> di tale classe e tutte le funzioni delle classi <code>friend</code> di tale classe, a meno che il file risultante diventi scomodo da gestire per la sua dimensione eccessiva.'''
 
In tal modo, sia il codice macchina prodotto compilando tali routine sia i dati statici definiti in tali classi e routine avranno indirizzi vicini tra loro; inoltre, così si consente ai compilatori che non effettuano ottimizzazioni sull'intero programma di ottimizzare le chiamate tra tali funzioni.
Line 38 ⟶ 43:
'''Definisci le variabili globali nell'unità di compilazione in cui sono usate più spesso.'''
 
In tal modo, tali variabili avranno indirizzi vicini tra loro e vicini a quelli delle variabili statiche definite in tale unità di compilazione; inoltre, così si consente ai compilatori che non effettuano ottimizzazioni sull'intero programma di ottimizzare l'utilizzoaccesso dia tali variabili dalleda parte delle funzioni che le usano maggiormente.
 
=== Funzioni e variabili private in unità di compilazione ===
Line 44 ⟶ 49:
'''Dichiara in un namespace anonimo le variabili e le funzioni globali a un'unità di compilazione, ma non usate da altre unità di compilazione.'''
 
In linguaggio C e anche in C++, tali variabili e funzioni possono essere dichiarate <code>static</code>.
In tal modo, si dichiara che non verranno usate da altre unità di compilazione. Questo permette ai compilatori che non effettuano ottimizzazioni sull'intero programma di ottimizzare l'utilizzo di tali variabili e funzioni.
 
Tuttavia, nel C++ moderno, l'uso di variabili e funzioni globali <code>static</code> è deprecato, e dovrebbe essere sostituito da variabili e funzioni dichiarate in un namespace anonimo.
 
In entrambi i casi, si dichiara al compilatore che tali identificatori non verranno usati da altre unità di compilazione.
In tal modo, si dichiara che non verranno usate da altre unità di compilazione. Questo permette ai compilatori che non effettuano ottimizzazioni sull'intero programma di ottimizzare l'utilizzo di tali variabili e funzioni.
 
[[Categoria:Ottimizzare C++|Accesso alla memoria]]
{{Avanzamento|75100%|2325 maggio 2008}}