Выравнивание

Выравнивание - это ограничение на то, с какой ячейки памяти по счету может храниться первый бит объекта. Выравнивание необходимо для ускорения доступа к памяти, к примеру, на архитектуре x86-64. Невыровненные данные обрабатываться могут, но это может быть медленно на некоторых архитектурах.

Также его важно учитывать при использовании векторных инструкций процессора, которые значительно ускоряют вычисления в некоторых случаях. Невыровненные данные в этом случае могут привести к генерации аппаратного исключения. Для справки, для SSE выравнивание должно составлять 16 байт, для AVX - 32 байта.

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

Выравнивание существует у каждого объекта. Для задания своего выравнивания в байтах у соответствующей переменной существует ключевое слово alignas, которое принимает степени двойки: 2, 4, 8, 16, 32, 64, 128 и так далее.

alignas(16) int a[4];
alignas(1024) int b[4];

Получить выравнивание объекта в compile-time можно с помощью ключевого слова alignof, причем возвращается наибольшая из степеней двойки.

static_assert(alignof(b) == 16); // fail
static_assert(alignof(b) == 1024); // OK