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 fsia una funzione che restituisce un puntatore, quindi
*f() += a;
chiama fsolo una volta, mentre
*f() = *f() + a;
lo chiama due volte. Se fha effetti collaterali, uno dei due sarà sbagliato (probabilmente quest'ultimo). Anche se fnon 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 += atraduce in
x.operator+=(a);
mentre si x = x + atraduce 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 +=.