Будь-компілятор варто його солі буде генерувати точно такій же послідовності на машинній мові для обох конструкцій для будь-якого вбудованого типу ( 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);
Тепер, якщо клас написаний належним чином, а оптимізатор компілятора достатньо хороший, обидва завершать генерування однієї і тієї ж машинної мови, але це не зовсім впевнене, як для вбудованих типів. Ймовірно, саме про це думає Строуструп, коли він заохочує використовувати +=
.