Alignement ist nicht für alle Typen geeignet. Sie sollten mit einer Struktur, um zu sehen, die Attribute in Aktion betrachten:
#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]);
}
Und dann werden Sie lesen:
0x603000 0x604000 0x605000 0x606000
Das ist, was Sie erwartet hatten.
Edit: Gedrückt von @yzap und folgenden @Caleb Fall Kommentar, das ursprüngliche Problem ist aufgrund der GCC-Version nur. Ich habe auf GCC 3.4.6 vs GCC geprüft 4.4.1 mit dem Quellcode des Autors ist:
$ ./test_orig-3.4.6
0x7fffe217d200 0x7fffe217d204 0x7fffe217d208 0x7fffe217d20c
$ ./test_orig-4.4.1
0x7fff81db9000 0x7fff81db9004 0x7fff81db9008 0x7fff81db900c
Es ist nun offensichtlich, dass ältere GCC-Versionen (irgendwo vor 4.4.1) Ausrichtung Pathologien zeigen.
Hinweis 1: Mein vorgeschlagener Code beantwortet nicht die Frage, die ich als "jedes Feld des Arrays ausrichten" verstanden habe.
Anmerkung 2: Bringt nicht-statische a [] innerhalb von main() und kompiliert mit GCC 3.4.6 bricht die Alignment-Direktive des Arrays von struct aber hält 0x1000 Abstand zwischen Strukturen ... immer noch schlecht! (siehe @zifer-Antwort für Problemumgehungen)
+1 richtige Antwort. Eine alternative Lösung besteht darin, das lokale Array statisch zu machen. Die Ausrichtung auf dem Stapel ist immer ein Problem, und es ist am besten, sich daran zu gewöhnen, es zu vermeiden. –
Oh ja, ich habe nicht daran gedacht es statisch zu machen. Das ist eine gute Idee, da es Namenskollisionen verhindert. Ich werde meine Antwort bearbeiten. – Zifre
Beachten Sie, dass es statisch ist und nicht einspringt und nicht threadsicher ist. – ArchaeaSoftware