Я просматривал Википедию / Ограничить и обнаружил, что
Компилятор может, например, переставить код, сначала загрузив все области памяти, затем выполнив операции перед передачей результатов.назад в память.
Позже я заметил, что
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.
Вы можете поэкспериментировать с ними здесь и здесь
Почему у них разные сборки?Было ли это ожидаемым?