Qualquer valor de compilador o seu sal vai gerar exatamente a mesma seqüência de linguagem de máquina para ambas as construções para qualquer tipo built-in ( int, float, etc), desde que a declaração é realmente tão simples como x = x + a; e otimização está habilitado . (Notavelmente, o GCC -O0, que é o modo padrão, realiza anti-otimizações , como inserir armazenamentos completamente desnecessários na memória, a fim de garantir que os depuradores sempre possam encontrar valores de variáveis.)
Se a declaração for mais complicada, porém, eles podem ser diferentes. Suponha que fseja uma função que retorna um ponteiro, então
*f() += a;
liga fapenas uma vez, enquanto
*f() = *f() + a;
chama duas vezes. Se ftiver efeitos colaterais, um dos dois estará errado (provavelmente o último). Mesmo se fnão tiver efeitos colaterais, o compilador pode não ser capaz de eliminar a segunda chamada, portanto, a última pode ser mais lenta.
E como estamos falando sobre C ++ aqui, a situação é totalmente diferente para tipos de classes que sobrecarregam operator+e operator+=. Se xfor esse tipo, então - antes da otimização - se x += atraduz em
x.operator+=(a);
Considerando que se x = x + atraduz em
auto TEMP(x.operator+(a));
x.operator=(TEMP);
Agora, se a classe for escrita corretamente e o otimizador do compilador for bom o suficiente, ambos acabarão gerando a mesma linguagem de máquina, mas não é uma coisa certa como é para tipos internos. Provavelmente é nisso que Stroustrup está pensando quando incentiva o uso de +=.