Jeder Compiler wert sein Salz wird erzeugen genau die gleiche Maschinensprachsequenz für beiden Konstrukte für jeden eingebauten Typen ( int
, float
usw.), solange die Aussage wirklich so einfach , wie x = x + a;
und Optimierung aktiviert ist . (Insbesondere GCCs -O0
, der Standardmodus, führen Anti-Optimierungen durch , z. B. das Einfügen völlig unnötiger Speicher in den Speicher, um sicherzustellen, dass Debugger immer variable Werte finden können.)
Wenn die Aussage jedoch komplizierter ist, können sie unterschiedlich sein. Angenommen, es f
handelt sich um eine Funktion, die dann einen Zeiger zurückgibt
*f() += a;
ruft f
nur einmal an, während
*f() = *f() + a;
ruft es zweimal auf. Wenn f
Nebenwirkungen auftreten, ist einer der beiden falsch (wahrscheinlich der letztere). Selbst wenn f
keine Nebenwirkungen auftreten, kann der Compiler den zweiten Aufruf möglicherweise nicht eliminieren, sodass letzterer möglicherweise langsamer ist.
Und da es sich hier um C ++ handelt, ist die Situation für Klassentypen, die operator+
und überladen, völlig anders operator+=
. Wenn x
es sich um einen solchen Typ handelt, wird vor der Optimierung in x += a
übersetzt
x.operator+=(a);
während x = x + a
übersetzt zu
auto TEMP(x.operator+(a));
x.operator=(TEMP);
Wenn die Klasse ordnungsgemäß geschrieben ist und der Optimierer des Compilers gut genug ist, werden beide dieselbe Maschinensprache generieren, aber es ist nicht sicher, wie es für integrierte Typen ist. Dies ist wahrscheinlich das, woran Stroustrup denkt, wenn er zur Verwendung ermutigt +=
.