Ottimizzare C++/Ottimizzazione del codice C++: differenze tra le versioni

Contenuto cancellato Contenuto aggiunto
Riga 308:
=== Valore di ritorno di funzioni ===
 
'''Per le funzioni che non siano espanse ''inline'', cerca di dichiarare il tipo di ritorno ''<code>void''</code> o ''<code>bool''</code> o intero o puntatore o riferimento. Comunque, evita di dichiarare un tipo di ritorno la cui copia sposta oltre 8 byte. Se non fosse fattibile, almeno costruisci l’oggetto da ritornare nelle stesse istruzioni ''<code>return''</code>.'''
 
Nella compilazione di una funzione non espansa inline, il compilatore non può sapere se il valore di ritorno verrà usato, e quindi lo deve comunque generare.
Generare un intero o un puntatore o un riferimento costa poco o niente, ma generare numeri a virgola mobile od oggetti più complessi richiede tempo.
Se la copia comporta l’allocazionel'allocazione di risorse, il tempo richiesto è enormemente maggiore, ma anche senza allocazioni, il tempo richiesto è cresce al crescere deidel numero delle word che vengono copiate quando si copia un oggetto di tale tipo.

Comunque, se si costruisce l’oggettol'oggetto da ritornare nelle stesse istruzioni “return”<code>return</code>, senza quindi assegnare tale valore a una variabile, si sfrutta l’ottimizzazionel'ottimizzazione garantita dallo standard detta ''Return Value Optimization'', che previene la creazione di oggetti temporanei.
Alcuni compilatori riescono a evitare la creazione di oggetti temporanei anche se sono legati a variabili locali (''Named Return Value Optimization''), ma in generale questo non è garantito.

Per verificare se viene attuata una di tali ottimizzazioni, inserisci un contatore nei costruttori, nei distruttori, e negli operatori di assegnamento della classe dell’oggettodell'oggetto ritornato.
Nel caso non risultassero applicate ottimizzazioni, ricorri a una delle seguenti tecniche alternative:
* Rendi la funzione “void”<code>void</code>, e aggiungile un argomento passato per riferimento, che funge da valore di ritorno.
* Trasforma la funzione in un costruttore del tipo ritornato, che riceve gli stessi parametri della funzione.
* Fai in modo che la funzione restituisca un oggetto di un tipo ausiliario che ruba le risorse e le cede all’oggettoall'oggetto destinazione, senza copiarle.
* Usa un “rvalue''rvalue reference”reference'', introdotto dallo standard C++0x.
* Usa un “expression''expression template”template''.
 
=== Spostamento di variabili all'esterno di cicli ===