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 f
zatem, że jest to funkcja, która zwraca wskaźnik
*f() += a;
dzwoni f
tylko raz, a tymczasem
*f() = *f() + a;
nazywa to dwukrotnie. Jeśli f
ma skutki uboczne, jeden z dwóch będzie zły (prawdopodobnie ten drugi). Nawet jeśli f
nie 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 x
jest takim typem, to - przed optymalizacją - x += a
przekłada się na
x.operator+=(a);
podczas gdy x = x + a
przekł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 +=
.