GCC属性(对齐(8))不工作
我在其他帖子中写过这个问题。尽管事实并非如此 GCC编译器版本:4.8.3(适用于ARM) 代码摘录: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 = (
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