Ottimizzare C++/Scrivere codice C++ efficiente/Costrutti che migliorano le prestazioni: differenze tra le versioni

Contenuto cancellato Contenuto aggiunto
Nessun oggetto della modifica
Nessun oggetto della modifica
Riga 8:
 
'''Non verificare che un puntatore sia non-nullo prima di chiamare <code>delete</code> su di esso.'''
 
Ossia, non scrivere il seguente codice:
 
<source lang=cpp>
if (p) delete p;
</source>
 
Tale controllo viene già fatto da ogni implementazione di <code>delete</code> conforme allo standard, e quindi sarebbe ridondante.
Line 99 ⟶ 105:
'''Come costanti per i casi delle istruzioni <code>switch</code>, usa sequenze compatte di valori, cioè senza lacune o con poche lacune.'''
 
I compilatori ottimizzanti, quando compilano un'istruzione <code>switch</code> i cui valori dei casi comprendonocostituiscono la maggior parte dei valori interi compresi in un intervallo, invece di generare una sequenza di istruzioni <code>if</code>, generano una ''jump-table'', ossia un array degli indirizzi ina cui inizia il codice di ogni caso, e quando eseguono lo <code>switch</code> usano tale tabella per saltare al codice associato al caso.
 
Per esempio, il seguente codice C++:
Line 118 ⟶ 124:
 
<source lang=cpp>
// N.B.: Questo non è codice C++
static indirizzo a[] = { caso_a, caso_b, 0fine, caso_a };
unsigned int indice = i - 10;
if (indice <=> 3) goto fine;
goto a[indice];
goto fine:
caso_a: funz_a(); goto fine;
caso_b: funz_b(); goto fine;
fine:
</source>
Line 150 ⟶ 156:
goto fine;
caso_a: funz_a(); goto fine;
caso_b: funz_b(); goto fine;
fine:
</source>
 
Per così pochi casi, probabilmente non ci sono molte differenze, ma con l'aumentare del numero di casi, lail primo codice è più efficiente in quanto esegue un solo ''goto calcolato'' invece di una cascataserie di <code>if</code>.
 
=== Ordine dei casi dell'istruzione <code>switch</code> ===
Line 190 ⟶ 196:
=== Raggruppamento di argomenti di funzione ===
 
'''Se una funzione riceve almeno sei argomenti, e viene chiamata spessoin un ciclo con gli stessi valori tranne eventualmenteal uno opiù due, prima del ciclo crea ununa oggettostruttura che contiene tutti gli argomenti, e passa alla funzione tale oggettostruttura per puntatore a costante o riferimento a costante.'''
 
Se una funzione riceve pochi argomenti, questi vengono posti direttamente nei registri, e quindi il loro passaggio è molto veloce; ma se gli argomenti non sono pochi, gli argomenti devono essere posti nello stack, anche se sono gli stessi della precedente chiamata alla stessa funzione.
 
Se invece si passa solo l'indirizzo di una struttura, questo indirizzo viene sicuramente posto in un registro, e i campi della struttura che non sono modificati tra chiamate successive della funzione devono essere assegnati solo la prima volta.
Line 227 ⟶ 233:
I tipi <code>double</code> sono efficienti quanto i <code>float</code>, ma sono più precisi.
 
Alcuni tipi di processore elaborano più velocemente gli oggetti di tipo <code>signed char</code>, mentre altrealtri elaborano più velocemente gli oggetti di tipo <code>unsigned char</code>.
Pertanto, in C e in C++ esiste il tipo <code>char</code> che corrisponde al tipo di carattere elaborato più velocemente sul processore target.
 
Line 254 ⟶ 260:
 
[[Categoria:Ottimizzare C++|Costrutti che migliorano le prestazioni]]
{{Avanzamento|75100%|2324 maggio 2008}}