GNU GCC编译器-对齐属性

GNU GCC编译器-对齐属性,c,gcc,attributes,memory-alignment,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 *) &ar

我正确地得到了校准警告

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

尽管有这个诡计,我还是得到了同样的警告。这是正常的还是警告应该消失?

想想看:
&array[10]
即使与
\uuuu属性((aligned(4)))
对齐,也不会是4字节对齐的,因为您看到的是10字节偏移到4字节对齐的数组中。因此,在本例中,您将只获得2字节对齐,gcc发出警告是正确的。尝试将索引设为12,而不是10,警告可能会消失。

想想看:
&array[10]
即使与
\uuuu属性((aligned(4)))对齐,也不会与4字节对齐。
。因此,在本例中,您将只获得2字节对齐,gcc发出警告是正确的。尝试将索引设为12,而不是10,警告可能会消失。

\uuuu属性(对齐(4))
仅对齐数组的开头,而不是数组的每个元素

如果开始对齐且偏移量为
10
,且偏移量不可除以4,则生成的地址将不会对齐。

\uuuuuu属性((对齐(4))
仅对齐数组的开始,而不是数组的每个元素


如果开头对齐,偏移量为
10
,也不能除以4,则生成的地址将不会对齐。

关于数组的索引错误,您是对的,我一次性编写了示例。然而,我尝试使用4的索引倍数,但警告仍然存在。也许我应该在意识到已经管理了它们之后禁用此类警告。是的,这在某种程度上取决于编译器和编译器版本-我尝试了各种版本的gcc和clang,得到了各种不同的结果。当然,您可能应该使用union而不是类型双关。请您为我指出一个如何使用union的有价值的例子?您的意思是什么?您可以定义一个union类型元素,其中union中有4 x uint8_t和1 x uint32_t,或者,如果您只想使用一个固定大小的数组,那么使用包含uint8_t数组和uint32_t数组的单个并集可能更方便。关于数组的索引错误,您是对的,我一次性编写了该示例。然而,我尝试使用4的索引倍数,但警告仍然存在。也许我应该在意识到已经管理了它们之后禁用此类警告。是的,这在某种程度上取决于编译器和编译器版本-我尝试了各种版本的gcc和clang,得到了各种不同的结果。当然,您可能应该使用union而不是类型双关。请您为我指出一个如何使用union的有价值的例子?您的意思是什么?您可以定义一个union类型元素,其中union中有4 x uint8_t和1 x uint32_t,或者,如果您只想使用一个固定大小的数组,那么使用包含uint8_t数组和uint32_t数组的单个并集可能更方便。