Одно слово в C, которое может ускорить ваш цикл
В C есть ключевое слово
restrict.
Оно говорит компилятору простую, но очень важную вещь:
«Эти указатели не пересекаются в памяти».
Без
restrict компилятор обязан быть осторожным. Он не знает, могут ли
a,
b и
result указывать на один и тот же участок памяти. Поэтому он не всегда может агрессивно оптимизировать код.
С
restrict ситуация меняется:
- компилятор уверен, что указатели не alias друг друга
- цикл можно безопаснее векторизовать
- загрузки и записи можно переупорядочивать
- проще включать SIMD-инструкции
- GCC и Clang получают больше свободы для оптимизаций
Пример:
void add_arrays(int *restrict a,
int *restrict b,
int *restrict result,
int n)
{
for (int i = 0; i < n; i++)
result[i] = a[i] + b[i];
}
Но есть важный момент.
restrict - это обещание программиста компилятору. Если вы соврали и передали пересекающиеся массивы, поведение может стать неопределённым.
Именно поэтому
restrict полезен в участках кода, где вы точно контролируете память: численные вычисления, обработка массивов, графика, DSP, low-level performance-код.
Иногда одно слово даёт компилятору больше информации, чем десяток ручных микрооптимизаций.
Обсуждение 8
Обсуждение не доступно в веб-версии. Чтобы написать комментарий, перейдите в приложение Telegram.
Обсудить в Telegram