GCC属性(对齐(8))不工作

GCC属性(对齐(8))不工作,c,gcc,C,Gcc,我在其他帖子中写过这个问题。尽管事实并非如此 GCC编译器版本:4.8.3(适用于ARM) 代码摘录: uint8_t data[4] __attribute__ ((aligned (8))) = {1,2,3,4}; int main() { uint32_t p = 0; p = (uint32_t)&data[0]; p = (uint32_t)&data[1]; p = (uint32_t)&data[2]; p = (

我在其他帖子中写过这个问题。尽管事实并非如此

GCC编译器版本:4.8.3(适用于ARM)

代码摘录:

uint8_t data[4] __attribute__ ((aligned (8))) = {1,2,3,4};

int main()
{
    uint32_t p = 0;
    p = (uint32_t)&data[0];
    p = (uint32_t)&data[1];
    p = (uint32_t)&data[2];
    p = (uint32_t)&data[3];
}
请注意,数据不在任何函数范围内,因此未在堆栈中分配

我在调试
p
时看到的结果是:
536870912、536870913、536870914、536870915

我期待这样的事情:
536870912536870920536870928536870936


任何帮助都将不胜感激。

您正在告诉编译器在8字节边界上对齐数组。不是每个成员。简单的回答是-您不能使用标量数据类型,因为编译器不允许在数组元素之间添加任何填充(毕竟,
*x++
作为uint8的指针,仍然应该只将指针增加1)

差不多

struct alignas(8) AL_BYTE{
   uint8_t theByte;
}
struct AL_BYTE data[4] __attribute__ ((aligned (8))) = {{.theByte=1},....
应该可以实现您想要的。

我打赌
对齐(…)
对齐整个数组,而不是单独对齐每个项目

据我所知,该标准禁止在数组元素之间添加任何额外的填充(数组的大小==每个项目的大小*项目的数量)

如果希望每个元素按8字节边界对齐,则需要元素的大小为8字节

可能的解决方案(将它们与
\uuuuuuu属性(对齐(8))结合起来)
):

  • 结构数组(
    struct{uint64_t byte,padding[7];};
  • 一个
    uint64\u t
    数组(然后需要确保只使用每个数字的最低字节)。这只能在lil-endian平台上正常工作
  • 一个包含
    uint8\u t
    的数组,比实际需要大8倍(同样,您需要确保只使用所需的字节)

一个可能的解决方案是对齐到一个新类型,然后用新类型生成一个数组,不幸的是,这个数组在GCC中不起作用

可以在中的评论中找到一些详细信息

但这对叮当有用。clang的行为是更改新类型的
sizeof
以包含所需的对齐方式


我认为这是一个GCC错误,并提交了一份错误报告。

数组的各个元素将
sizeof(T)
分开,根据定义。@Mat yes这就是我所期望的。@Oliver Charlesworth那么我如何在地址中分配这些元素,如果可能是@Hairi的重复-这里的实际用例是什么?我真的不确定我是否喜欢允许
typedef
更改数组中简单数据类型的对齐方式。注意,我并不是说这是对的还是错的,我对标准不够熟悉。用户定义的数据类型,比如结构,我一般都可以接受,但是像您的示例中那样的标量数据类型-这让我感到很痒…..
sizeof
的含义之一是“使用的大小”与“有效的大小”对于标量的含义。@tofro根据标准
sizeof
确实是“使用的大小”。
typedef char AlignedChar __attribute__ ((aligned (8)));

AlignedChar test[16]={};

//prog.c:4:1: error: alignment of array elements is greater than element size