Будь-компілятор варто його солі буде генерувати точно такій же послідовності на машинній мові для обох конструкцій для будь-якого вбудованого типу ( int, float, і т.д.) до тих пір , як твердження дійсно так просто , як x = x + a; і оптимізація включена . (Зокрема, GCC -O0, який є типовим режимом, виконує анти-оптимізацію , наприклад, вставляє в пам’ять абсолютно непотрібні сховища, щоб гарантувати, що налагоджувачі завжди можуть знаходити змінні значення.)
Якщо твердження є більш складним, вони можуть бути різними. Припустимо f, це функція, яка повертає покажчик
*f() += a;
дзвонить fлише один раз, тоді як
*f() = *f() + a;
називає це двічі. Якщо fє побічні ефекти, один із двох буде помилковим (можливо, останній). Навіть якщо fвін не має побічних ефектів, компілятор може не змогти усунути другий виклик, тому останній дійсно може бути повільнішим.
І оскільки ми тут говоримо про С ++, то для типів класів, які перевантажують operator+і operator+=. Якщо xце такий тип, то - перед оптимізацією - x += aозначає
x.operator+=(a);
тоді як x = x + aперекладається на
auto TEMP(x.operator+(a));
x.operator=(TEMP);
Тепер, якщо клас написаний належним чином, а оптимізатор компілятора достатньо хороший, обидва завершать генерування однієї і тієї ж машинної мови, але це не зовсім впевнене, як для вбудованих типів. Ймовірно, саме про це думає Строуструп, коли він заохочує використовувати +=.