我正在尝试将复合文字对齐到16个字节。
我找到了this
其为:
#define ALIGNED_STRING(S) (struct { _Alignas(16) char s[sizeof S]; }){ S }.s
char *u = ALIGNED_STRING("agsdas");
编译。
并尝试将其应用于uint32_t。
到目前为止,我用gcc试过这个。
#define BLOCK_ALIGNED_U32(...) (struct { _Alignas(16) uint32_t x[sizeof ((uint32_t[]){__VA_ARGS__})]; }){ __VA_ARGS__ }.x
uint32_t toto[] = BLOCK_ALIGNED_U32(0x11111111, 0x22222222);
甚至:
uint32_t tata[] = (struct { uint32_t __attribute__((aligned(16))) x[2]; }){.x = {0x11111111, 0x22222222}}.x;
但它给了我error : invalid initializer
我做错了什么/遗漏了什么?
注意:我这样做是因为我想控制结构声明中某个数据块的对齐,如下所示:
struct
{
uint32_t* foo1;
uint32_t* foo2;
uint32_t* foo3;
uint32_t* foo4;
}s_t;
s_t foo[]=
{
.foo1 = BLOCK_ALIGNED_U32(1,2,3),
.foo2 = BLOCK_ALIGNED_U32(2,2),
.foo3 = (uint32_t[]){1,2,3},//could be not 16-bytes-aligned
.foo4 = (uint32_t[]){2,2},//could be not 16-bytes-aligned
}
2条答案
按热度按时间vshtjzan1#
至少这些问题:
{ }
相加样本使用
oxf4rvwz2#
对齐方式由对象的类型和与对象本身相关联的指令决定,而不是由初始化它的值决定。
换句话说,在
uint32_t foo[] =
的右边不能放置任何会影响数组或数组中各个元素对齐方式的东西。我们来比较一下。
在链接的帖子中
这会产生两个对象。
正如您所看到的,
ALIGNED_STRING
对变量(u
)的对齐没有影响,只是对u
将要指向的anon对象的对齐有影响。在你的岗位上
这会产生单一对象。
如果你有一个指向
uint32_t
的指针数组,你可以根据自己的意愿对齐这些uint32_t
。匿名对象可以使用
( type ){ initializer body }
语法来创建,也可以使用_Alignas
作为类型的一部分来对齐对象。以上两种方法都会产生五个对象。
样品运行:
编译器资源管理器上的Demo