Компилятор GNU GCC - выровненный атрибут - PullRequest
0 голосов
/ 26 сентября 2018

Я правильно получил предупреждение о выравнивании

приведение увеличивает требуемое выравнивание целевого типа [-Wcast-align]

от компилятора GCC из-за следующего кода:

uint8_t array[100];

uint32_t foo;
foo = * ( (uint32_t *) &array[10]);

Затем я использовал атрибут aligned, чтобы выяснить проблему:

uint8_t array[100] __attribute__ ((aligned(4)));

uint32_t foo;
foo = * ( (uint32_t *) &array[10]);

Несмотря на этот трюк, я получил то же предупреждение.Это нормально или предупреждение должно исчезнуть?

Ответы [ 2 ]

0 голосов
/ 26 сентября 2018

__attribute__ ((aligned(4))) выравнивает только начало массива, а не каждый его элемент.

Если начало выровнено и смещение равно 10, которое не делится на4 полученный адрес не будет выровнен.

0 голосов
/ 26 сентября 2018

Подумайте об этом: &array[10] не будет выровнено на 4 байта даже с __attribute__ ((aligned(4))), так как вы смотрите на смещение в 10 байтов в выровненный массив из 4 байтов.Таким образом, в этом примере вы получите только 2-байтовое выравнивание, и gcc будет правильным, чтобы выдать предупреждение.Попробуйте с индексом, скажем, 12 вместо 10, и предупреждение может исчезнуть.

...