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 f
seja uma função que retorna um ponteiro, então
*f() += a;
liga f
apenas uma vez, enquanto
*f() = *f() + a;
chama duas vezes. Se f
tiver efeitos colaterais, um dos dois estará errado (provavelmente o último). Mesmo se f
nã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 x
for esse tipo, então - antes da otimização - se x += a
traduz em
x.operator+=(a);
Considerando que se x = x + a
traduz 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 +=
.