emoji Одно слово в 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-код.

Иногда одно слово даёт компилятору больше информации, чем десяток ручных микрооптимизаций.
23
👍 9
🔥 5
8 54 3.1K

Обсуждение 8

Обсуждение не доступно в веб-версии. Чтобы написать комментарий, перейдите в приложение Telegram.

Обсудить в Telegram