Выравнивание не эффективно для всех типов. Вы должны рассмотреть возможность использования структуры, чтобы увидеть атрибуты в действии:
#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]);
}
И тогда вы прочтете:
0x603000 0x604000 0x605000 0x606000
Что ты и ожидал.
Edit:
Нажимая @yzap и следуя комментарию @Caleb Case, первоначальная проблема связана с версией GCC только . Я проверил GCC 3.4.6 против GCC 4.4.1 с исходным кодом запрашивающей стороны:
$ ./test_orig-3.4.6
0x7fffe217d200 0x7fffe217d204 0x7fffe217d208 0x7fffe217d20c
$ ./test_orig-4.4.1
0x7fff81db9000 0x7fff81db9004 0x7fff81db9008 0x7fff81db900c
Теперь очевидно, что более старые версии GCC (где-то до 4.4.1) демонстрируют патологии выравнивания.
Примечание 1: Мой предложенный код не отвечает на вопрос, который я понял как «выравнивание каждого поля массива».
Примечание 2: перенос нестатического a [] в main () и компиляция с GCC 3.4.6 нарушает директиву выравнивания массива struct, но сохраняет расстояние 0x1000 между структурами ... все еще плохо! (см. @zifre ответ для обходных путей)