alignas спецификатор выравнивания данных в памяти С++

alignas - спецификатор введенный в С++11 и служащий для выравнивания переменных по границе указанного в alignas количества байт. Это используется для увеличения быстродействия вычислений, так как процессоры быстрее работают с данными в памяти, если они выровнены по границе в 4, 8 или 16 байт. В ряде случаев данные обязательно должны быть выровнены, например, с рядом SSE команд или на некоторых ARM процессорах.

Адрес выравненный по границе 4 байта будет иметь в двоичном представлении последние два нуля, по границе 8 байт - три нуля, а по границе 16 байт - четыре нуля. Очевидно что адрес выравненный по границе 16 байт, также выравнен и по границам 4 и 8 байт. В компьютерах адресуемой информацией является байт, соответственно адрес в памяти это указатель на порядок байта (начало байта).

Современные процессоры загружают себе из памяти как минимум 4 байта, с границ выравненных по 4 байта. Если требуемые данные не выравнены по этим границам то процессору приходится 2 раза производить вычитывание а потом объединять требуемые байты, что приводит к уменьшению производительности в до 3-х раз.

Компилятор С++ пытается сам выровнять данные, если это не обходимо и писать везде alignas не требуется. Явно стоит указывать спецификатор alignas требуется если вы используете:
- Переменные для SSE/MMX;
- Массивы большого размера с интенсивными обращения к его элементам;
- Интенсивную работу с переменными.


alignas(4) int sum;     // Выравниваем переменную по границе 4 байта
alignas(16) int ar[4];  // Выравниваем массив по границе 16 байт
alignas(8) int res[4];  // Выравниваем массив по границе 8 байт
2023-10-22



Понравилась страница?
Добавить в закладки
Или поделиться!

Связанные темы

alignas спецификатор выравнивания данных в памяти С++
alignof оператор С++11 возвращает количество байт требуемых для выравнивания типа данных
nullptr C++ значение для нулевого указателя
Стек и куча в С++