GNU GCC编译器-对齐的属性

时间:2018-09-26 08:04:27

标签: c gcc attributes memory-alignment

我正确地收到了对齐警告

  

cast增加了对目标类型[-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 :(得分:1)

__attribute__ ((aligned(4)))仅对齐数组的开头,而不对齐数组的每个元素。

如果起始位置对齐并且偏移量为10(不能被4整除),则结果地址将不对齐。

答案 1 :(得分:0)

考虑一下:&array[10]甚至不会与__attribute__ ((aligned(4)))对齐4字节,因为您正在将10字节的偏移量看成4字节对齐的数组。因此,在此示例中,您将仅获得2字节对齐,并且gcc正确会发出警告。尝试使用索引12而不是10进行尝试,然后警告可能消失。