La alineación no es efectiva para todos los tipos. Usted debe considerar el uso de una estructura para ver los atributos de la acción:
#include <stdio.h>
struct my_float {
float number;
} __attribute__((aligned(0x1000)));
struct my_float a[4] = { {1.0}, {2.0}, {3.0}, {4.0} };
int
main(void)
{
printf("%p %p %p %p\n", &a[0], &a[1], &a[2], &a[3]);
}
Y entonces, usted leerá:
0x603000 0x604000 0x605000 0x606000
¿Qué es lo que estabas esperando.
Editar: Empujado por @yzap y comentario siguiente @Caleb caso, el problema inicial se debe a GCC versión única. He comprobado en GCC 3.4.6 vs GCC 4.4.1 con el código fuente del solicitante:
$ ./test_orig-3.4.6
0x7fffe217d200 0x7fffe217d204 0x7fffe217d208 0x7fffe217d20c
$ ./test_orig-4.4.1
0x7fff81db9000 0x7fff81db9004 0x7fff81db9008 0x7fff81db900c
Ahora es obvio que las versiones anteriores del CCG (en algún lugar antes 4.4.1) muestra patologías de alineación.
Nota 1: Mi código propuesto no responde la pregunta que entendí como "alinear cada campo de la matriz".
Nota 2: Traer no estático a [] dentro de main() y compilar con GCC 3.4.6 rompe la directiva de alineación de la matriz de struct pero mantiene la distancia 0x1000 entre las estructuras ... ¡sigue siendo malo! (Consulte la respuesta de @zifre para las soluciones)
+1 respuesta correcta. Una solución alternativa es hacer la matriz local estática. La alineación en la pila siempre es un problema y es mejor acostumbrarse a evitarla. –
Oh, sí, no pensé en hacerlo estático. Esa es una buena idea, ya que evita las colisiones de nombres. Editaré mi respuesta. – Zifre
Tenga en cuenta que al ser estático también lo hace no reentrante y no es seguro para subprocesos. – ArchaeaSoftware