Спецификатор **restrict** означает, что этот указатель единственное средство доступа к соответствующему объекту. Его можно применять только указателям. Наличие спецификатора расширяет возможности компилятора по оптимизации.

По своей сути мы обещаем, что этот указатель будет первым и единственным способом доступа к соответствующей области памяти в соответствующем блоке кода \(функции\). В свою очередь, компилятор обещает его ускорить.

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

Часто такой спецификатор применяется в отношении формальных параметров стандартных функций библиотеки языка С.

```text
void * memcpy (void * restrict ptr1, void * restrict ptr2, size_t n);
```

Спецификаторы, применённые к параметрам функции копирования, обозначают , что эти области памяти ptr1 и ptr2 не пересекаются.

## Выравнивание данных

Оперирование данными происходит кэш линиями по 64 байта. SSE и AVX инструкции всегда попадают в кэш линию если данные выравнены на границу 16 или 32 байта.

Выравнивание данных производится для правильного и быстрого доступа центрального процессора к ячейкам памяти. В зависимости от разрядности системы расположение классов/структур в памяти может начинаться с адресов кратных 32 или 64 битам. Внутри самих классов/структур поля также могут выравниваться по границе 32, 16 или 8 бит.

Но выравнять данные само по себе не достаточно — необходимо информировать компилятор о том, что известно вам, и тогда можно получить на выходе наиболее эффективное приложение.

