Jeder Compiler wert sein Salz wird erzeugen genau die gleiche Maschinensprachsequenz für beiden Konstrukte für jeden eingebauten Typen ( int, floatusw.), 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 fhandelt sich um eine Funktion, die dann einen Zeiger zurückgibt
*f() += a;
ruft fnur einmal an, während
*f() = *f() + a;
ruft es zweimal auf. Wenn fNebenwirkungen auftreten, ist einer der beiden falsch (wahrscheinlich der letztere). Selbst wenn fkeine 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 xes 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 +=.