Слово restrict применяемое к аргументам функции говорит, что
фрагмент памяти, на который указывает restrict-указатель совершенно
точно не будет меняться при записи по другим указателям (в т.ч.
restrict) с которыми работает функция. Типичный пример -- memcpy.
Если копировать пересекающиеся блоки памяти, то результат может
зависет от того, копируется блок в сторону увеличения или
уменьшения адресов, поэтому переставить инструкции чтения-записи
никак нельзя. Указание restrict позволяет компилятору понять, что блоки точно не пересекающиеся (а кому нужны пересекающиеся -- есть memmove). Ключевого слова нет в C89 (только в C99) и нет в C++. Поэтому есть макрос __RESTRICT с пустым определением на платформах, где ключевое слово restrict не поддерживается.
https://ru.wikipedia.org/wiki/Restrict