Стандарт не определяет порядок вычисления аргументов с этой строкой:
Порядок оценки аргументов не уточняется.
Что значит
Лучший код может быть сгенерирован при отсутствии ограничений на
порядок вычисления выражений
означают?
Какой недостаток заключается в том, что все компиляторы просят оценить аргументы функции, например, слева направо? Какие виды оптимизации выполняют компиляторы из-за этой неопределенной спецификации?
Разрешение компилятору переупорядочивать оценку операндов добавляет больше возможностей для оптимизации.
Вот полностью составленный пример для иллюстрации.
Предположим, процессор может:
Теперь предположим, что у вас есть вызов функции следующим образом:
foo(a += 1, b += 2, c += 3, d *= 10);
Если бы вы должны были выполнить это слева направо на процессоре без УНО:
Cycle - Operation
0 - a += 1
1 - b += 2
2 - c += 3
3 - d *= 10
4 - d *= 10
5 - d *= 10
Теперь, если вы позволите компилятору переупорядочить их: (и сначала запустите умножение)
Cycle - Operation
0 - d *= 10
1 - a += 1, d *= 10
2 - b += 2, d *= 10
3 - c += 3
Итак, 6 циклов против 4 циклов.
Опять же, это полностью надумано. Современные процессоры намного сложнее. Но ты получил идею.
Вот простой пример. Предположим, у вас есть вызов функции следующим образом:
// assume that p is a pointer to an integer
foo(*p * 3, bar(), *p * 3 + 1);
Компилятору нужно разыменовать p
дважды (и сделать некоторые вычисления на основе результата) и вызвать bar
один раз. Если компилятор умен, он может изменить порядок оценки
int temp = *p * 3;
foo(temp, bar(), temp + 1);
Таким образом, он должен выполнить «разыменование, умножить на 3» только один раз. Это известно как устранение общего подвыражения.