Изменение порядка указателей «Restrict» приводит к различным сборкам. - PullRequest
0 голосов
/ 07 июня 2018

Я просматривал Википедию / Ограничить и обнаружил, что

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

Позже я заметил, что

void updatePtrs(long int *restrict ptrA, long int *ptrB, long int *val)
{
  *ptrA += *val;
  *ptrB += *val;
}

и

void updatePtrs(long int *restrict ptrA, long int *ptrB, long int *val)
{
  *ptrB += *val;
  *ptrA += *val;
}

не дают ту же сборку с -Ofast.Это относится как к GCC, так и к Clang.

Вы можете поэкспериментировать с ними здесь и здесь

Почему у них разные сборки?Было ли это ожидаемым?

1 Ответ

0 голосов
/ 07 июня 2018

Ни ptrB, ни val не являются restrict, поэтому ptrB и val могут указывать на одно и то же long.Когда они это делают, порядок *ptrA += *val; и *ptrB += *val; имеет значение.

Даже если бы все указатели были restrict, компилятору было бы разрешено, но не обязательно, переставлять операции.

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