Ogni compilatore degno genererà esattamente la stessa sequenza di linguaggio macchina per entrambi i costrutti per qualsiasi tipo built-in ( int
, float
, ecc) fino a quando l'affermazione è davvero così semplice come x = x + a;
e ottimizzazione è abilitato . (In particolare, GCC -O0
, che è la modalità predefinita, esegue anti-ottimizzazioni , come l'inserimento di archivi completamente non necessari in memoria, al fine di garantire che i debugger possano sempre trovare i valori delle variabili.)
Se l'affermazione è più complicata, però, potrebbero essere diverse. Supponiamo che f
sia una funzione che restituisce un puntatore, quindi
*f() += a;
chiama f
solo una volta, mentre
*f() = *f() + a;
lo chiama due volte. Se f
ha effetti collaterali, uno dei due sarà sbagliato (probabilmente quest'ultimo). Anche se f
non ha effetti collaterali, il compilatore potrebbe non essere in grado di eliminare la seconda chiamata, quindi quest'ultima potrebbe effettivamente essere più lenta.
E poiché qui stiamo parlando di C ++, la situazione è completamente diversa per i tipi di classe che sovraccaricano operator+
e operator+=
. Se x
è un tale tipo, allora, prima dell'ottimizzazione, si x += a
traduce in
x.operator+=(a);
mentre si x = x + a
traduce in
auto TEMP(x.operator+(a));
x.operator=(TEMP);
Ora, se la classe è scritta correttamente e l'ottimizzatore del compilatore è abbastanza buono, entrambi finiranno per generare lo stesso linguaggio macchina, ma non è una cosa sicura come lo è per i tipi incorporati. Questo è probabilmente ciò a cui sta pensando Stroustrup quando ne incoraggia l'uso +=
.