Ottimizzare C++/Scrivere codice C++ efficiente/Accesso alla memoria: 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 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
* '''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 <source lang=cpp>
float a[num_livelli][num_righe][num_colonne];
for (int liv = 0; liv < num_livelli; ++
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
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'
=== 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.
▲
[[Categoria:Ottimizzare C++|Accesso alla memoria]]
{{Avanzamento|
|