L'allineamento non è valido per tutti i tipi. Si dovrebbe considerare l'utilizzo di una struttura per vedere gli attributi in azione:
#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]);
}
E poi, potrai leggere:
0x603000 0x604000 0x605000 0x606000
che è quello che ti aspettavi.
Edit: Spinto dalla @yzap e commentare seguente @Caleb caso, il problema iniziale è dovuto al GCC versione solo. Ho controllato su GCC 3.4.6 vs GCC 4.4.1 con il codice sorgente del richiedente:
$ ./test_orig-3.4.6
0x7fffe217d200 0x7fffe217d204 0x7fffe217d208 0x7fffe217d20c
$ ./test_orig-4.4.1
0x7fff81db9000 0x7fff81db9004 0x7fff81db9008 0x7fff81db900c
E 'ormai evidente che le versioni più vecchie di GCC (da qualche parte prima 4.4.1) mostra patologie di allineamento.
Nota 1: il mio codice proposto non risponde alla domanda che ho inteso come "allineamento di ogni campo dell'array".
Nota 2: l'inserimento di un [] in main() non statico con GCC 3.4.6 interrompe la direttiva di allineamento dell'array di struct ma mantiene 0x1000 la distanza tra le strutture ... ancora male! (vedi risposta @zifre per soluzioni alternative)
+1 risposta corretta. Una soluzione alternativa consiste nel rendere statico l'array locale. L'allineamento in pila è sempre un problema ed è meglio prendere l'abitudine di evitarlo. –
Oh sì, non pensavo di renderlo statico. Questa è una buona idea dal momento che previene le collisioni di nomi. Modificherò la mia risposta. – Zifre
Nota che renderlo statico lo rende anche non rientranti e non thread-safe. – ArchaeaSoftware