La alineación es una restricción sobre qué posiciones de memoria se pueden almacenar el primer byte de un valor. (Es necesario para mejorar el rendimiento de los procesadores y permitir el uso de ciertas instrucciones que funcionan solo en datos con una alineación particular, por ejemplo, SSE debe alinearse a 16 bytes, mientras que AVX a 32 bytes).
La alineación de 16 significa que las direcciones de memoria que son múltiplos de 16 son las únicas direcciones válidas.
alignas
forzar la alineación al número requerido de bytes. Solo puedes alinear a potencias de 2: 1, 2, 4, 8, 16, 32, 64, 128, ...
#include <cstdlib>
#include <iostream>
int main() {
alignas(16) int a[4];
alignas(1024) int b[4];
printf("%p\n", a);
printf("%p", b);
}
ejemplo de salida:
0xbfa493e0
0xbfa49000
1011 1111 1010 0100 1001 0011 1110 0000
1011 1111 1010 0100 1001 0000 0000 0000
la otra palabra clave
alignof
es muy conveniente, no puedes hacer algo como
int a[4];
assert(a % 16 == 0);
pero tu puedes hacer
assert(alignof(a) == 16);
assert(alignof(b) == 1024);
tenga en cuenta que en realidad esto es más estricto que una simple operación de "%" (módulo). De hecho, sabemos que algo alineado a 1024 bytes está necesariamente alineado a 1, 2, 4, 8 bytes pero
assert(alignof(b) == 32);
Entonces, para ser más precisos, "alignof" devuelve la mayor potencia de 2 con la que algo está alineado.
También alignof es una buena manera de conocer de antemano el requisito de alineación mínimo para tipos de datos básicos (probablemente devolverá 1 para caracteres, 4 para flotante, etc.).
Todavía legal:
alignas(alignof(float)) float SqDistance;
Algo con una alineación de 16 se colocará en la siguiente dirección disponible que sea un múltiplo de 16 (puede haber un relleno implícito de la última dirección utilizada).