Точки последовательности, условные выражения и оптимизации

Сегодня у меня был спор с одним из моих коллег по поводу того факта, что компилятор может изменять семантику программы, когда включены агрессивные оптимизации.

Мой коллега утверждает, что когда оптимизации включены, компилятор может изменить порядок некоторых инструкций. Так что:

function foo(int a, int b)
{
  if (a > 5)
  {
    if (b < 6)
    {
      // Do something
    }
  }
}

Можно изменить на:

function foo(int a, int b)
{
  if (b < 6)
  {
    if (a > 5)
    {
      // Do something
    }
  }
}

Конечно, в этом случае он не меняет общего поведения программы и не действительно важен.

Насколько я понимаю, я считаю, что два if (condition) принадлежат двум разным точкам последовательности и что компилятор не может изменить их порядок, даже если его изменение сохранит такое же общее поведение.

Итак, уважаемые пользователи SO, какова правда относительно этого?

6
задан ereOn 25 January 2011 в 16:41
поделиться