GNU GCC编译器 - 对齐的属性

问题描述 投票:0回答:2

我正确地得到了对齐警告

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]);

尽管如此,我还是得到了同样的警告。这是正常的还是警告应该消失?

c gcc attributes memory-alignment
2个回答
0
投票

想一想:&array[10]即使用__attribute__ ((aligned(4)))也不会对齐4字节,因为你正在查看一个4字节对齐数组的10字节偏移量。因此,在此示例中,您将只获得2字节对齐,并且gcc发出警告是正确的。尝试索引为12而不是10,警告可能会消失。


1
投票

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

如果开头是对齐的,并且偏移量是qazxsw poi,它不能被4整除,则生成的地址将不会对齐。

© www.soinside.com 2019 - 2024. All rights reserved.