Acredito que o problema é que seu array está na pilha e que seu compilador é muito antigo para suportar variáveis de pilha superalinhadas. O GCC 4.6 e posterior corrigiu esse bug .
C11 / C ++ 11 alignas(64) float a[4];
simplesmente funciona para qualquer alinhamento de potência de 2.
O GNU C também__attribute__((aligned(x)))
conforme você o estava usando.
(Em C11, #include <stdalign.h>
para #define alignas _Alignas
: cppref ).
Mas no seu caso de um alinhamento muito grande, para um limite de página de 4k, você pode não querer isso na pilha.
Como o ponteiro da pilha pode ser qualquer coisa quando a função é iniciada, não há como alinhar a matriz sem alocar muito mais do que você precisa e ajustá-lo. (Compiladores irãoand rsp, -4096
ou equivalente e não usarão nenhum dos 0 a 4088 bytes alocados; ramificar se esse espaço é grande o suficiente ou não seria possível, mas não é feito porque grandes alinhamentos muito maiores que o tamanho da matriz ou outros locais não são o caso normal.)
Se você mover o array da função para uma variável global, ele deve funcionar. A outra coisa que você pode fazer é mantê-la como uma variável local (o que é uma coisa muito boa), mas faça-a static
. Isso evitará que ele seja armazenado na pilha. Esteja ciente de que ambas as formas não são seguras para threads ou recursivas, pois haverá apenas uma cópia do array.
Com este código:
#include <stdio.h>
float a[4] __attribute__((aligned(0x1000))) = {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]);
}
Eu entendi isso:
0x804c000 0x804c004 0x804c008 0x804c00c
que é o que se espera. Com seu código original, recebo apenas valores aleatórios como você fez.