Wszelkie warta jego sól kompilator wygeneruje dokładnie taką samą sekwencję maszynowego języka dla obu konstruktów dla dowolnego typu wbudowanego ( int, float, etc), o ile oświadczenie naprawdę jest tak proste, jak x = x + a; i optymalizacji jest włączona . (Warto zauważyć, że GCC -O0, który jest trybem domyślnym, wykonuje antyoptymalizacje , takie jak wstawianie całkowicie niepotrzebnych magazynów do pamięci, aby upewnić się, że debuggery zawsze mogą znaleźć wartości zmiennych).
Jeśli jednak stwierdzenie jest bardziej skomplikowane, mogą być inne. Załóżmy fzatem, że jest to funkcja, która zwraca wskaźnik
*f() += a;
dzwoni ftylko raz, a tymczasem
*f() = *f() + a;
nazywa to dwukrotnie. Jeśli fma skutki uboczne, jeden z dwóch będzie zły (prawdopodobnie ten drugi). Nawet jeśli fnie ma skutków ubocznych, kompilator może nie być w stanie wyeliminować drugiego wywołania, więc to drugie może być rzeczywiście wolniejsze.
A ponieważ mówimy tutaj o C ++, sytuacja jest zupełnie inna w przypadku typów klas, które przeciążają operator+i operator+=. Jeśli xjest takim typem, to - przed optymalizacją - x += aprzekłada się na
x.operator+=(a);
podczas gdy x = x + aprzekłada się na
auto TEMP(x.operator+(a));
x.operator=(TEMP);
Teraz, jeśli klasa jest poprawnie napisana, a optymalizator kompilatora jest wystarczająco dobry, oba kończą się generowaniem tego samego języka maszynowego, ale nie jest to takie pewne, jak w przypadku typów wbudowanych. Prawdopodobnie o tym myśli Stroustrup, zachęcając do używania +=.