Почему порядок вычисления параметров функции не указан в c ++?

Стандарт не определяет порядок вычисления аргументов с этой строкой:

Порядок оценки аргументов не уточняется.

Что значит

Лучший код может быть сгенерирован при отсутствии ограничений на
порядок вычисления выражений

означают?

Какой недостаток заключается в том, что все компиляторы просят оценить аргументы функции, например, слева направо? Какие виды оптимизации выполняют компиляторы из-за этой неопределенной спецификации?

9

Решение

Разрешение компилятору переупорядочивать оценку операндов добавляет больше возможностей для оптимизации.

Вот полностью составленный пример для иллюстрации.

Предположим, процессор может:

  • Выпуск 1 инструкции каждый цикл.
  • Выполните сложение в 1 цикле.
  • Выполните умножение в 3 цикла.
  • Может выполнять сложения и умножения одновременно.

Теперь предположим, что у вас есть вызов функции следующим образом:

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 циклов.

Опять же, это полностью надумано. Современные процессоры намного сложнее. Но ты получил идею.

25

Другие решения

Вот простой пример. Предположим, у вас есть вызов функции следующим образом:

// 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» только один раз. Это известно как устранение общего подвыражения.

1

По вопросам рекламы [email protected]