Порядок оценки C ++ и последовательность перед и порядок компиляции? - PullRequest
0 голосов
/ 09 ноября 2018

Я прочитал Порядок оценки , и я не очень хорошо понимаю.Означает ли порядок порядок выполнения во время выполнения или только логический порядок в исходном коде?

Давайте рассмотрим фрагмент кода, как показано ниже:

void f()
{
   int a = 10; // A
   int b = 20; // B
   //...
}

Означает ли это, чтовыражение A упорядочено перед выражением B?

И разрешено ли компилятору c ++ переупорядочивать код следующим образом?

void f()
{
   int b = 20; // B
   int a = 10; // A
    //...
}

Если компилятор переупорядочивает код, как указано выше, то мы должны сказать, что выражение B упорядочено до A?

1 Ответ

0 голосов
/ 09 ноября 2018

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

Фактически, ваш типичный компилятор C / C ++, с любыми разумными флагами оптимизации, имеет такую ​​функцию, как:

void f (void) {
  int a = 20;
  int b = 10;
}

просто скомпилирует это как:

f:
  ret

Другими словами, он будет обрабатывать его как пустую функцию. Причина в том, что функция не имеет никаких эффектов; этим переменным присваиваются значения, но их значения никогда не используются (в технических терминах они мертвые хранилища ), и поэтому компилятор может их игнорировать.

Теперь давайте посмотрим на более практичный пример:

void foo (int num, int * num2, int * num3) {
  *num2 = num * 2;
  *num3 = num * 3;
}

Может ли компилятор переупорядочить эти операторы? Ответ фирмы нет . Причина в том, что num2 и num3 могут указывать на один и тот же адрес (другими словами, вы можете вызывать функцию, например foo(3, &bar, &bar)), и, следовательно, порядок записи имеет значение. С другой стороны, только в C (но не в C ++) мы могли бы написать это так:

void foo (int num, int * restrict num2, int * restrict num3) {
  *num2 = num * 2;
  *num3 = num * 3;
}

В этом случае ключевое слово restrict сообщает компилятору, что указатели должны указывать на разные адреса, и, следовательно, изменение порядка операторов допустимо, поскольку результаты одинаковы независимо от порядка их выполнения.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...