等价于 C 中的 std::aligned_storage<>?
Equivalent of std::aligned_storage<> in C?
在 C 中,有没有办法在堆栈上进行过度对齐(即比从类型系统推断出的对齐更多的对齐)?
对于动态分配内存中的变量,如果所有其他方法都失败,我们总是可以手动对齐,但是对于自动分配内存中的变量可以做什么?
我想可以使用 char[size + alignment - 1]
然后总是使用位操作来访问变量,但这似乎 "bit" 比必要的更隐蔽(哈哈哈 ;))。
在C2011中,有_Alignas
and _Alignof
keywords, the header <stdalign.h>
which makes their use slightly less ugly, and the type max_align_t
(在<stddef.h>
中)。例如,您可以写
double _Alignas(4*_Alignof(double)) dvector[16];
请求一个包含 16 个 double
数量的数组,对齐方式为 double
的通常对齐方式的 4 倍,这对于与 CPU 特定向量指令一起使用可能是必要的。这不能保证对所有实现都有效,但如果它不起作用,则保证是编译时错误。
在 C2011 之前,没有标准 方法来执行此操作,但许多编译器确实具有具有类似功能的扩展,例如GCC 的 __attribute__ (aligned)
结构。
我想到了工会。
union This
{
int integer;
align_type alignment;
} ;
联合中的成员之前没有填充。因此,如果您声明一个自动变量 union This
,那么它及其所有成员的对齐方式应与具有最高对齐方式的成员的对齐方式相同。
在 C 中,有没有办法在堆栈上进行过度对齐(即比从类型系统推断出的对齐更多的对齐)?
对于动态分配内存中的变量,如果所有其他方法都失败,我们总是可以手动对齐,但是对于自动分配内存中的变量可以做什么?
我想可以使用 char[size + alignment - 1]
然后总是使用位操作来访问变量,但这似乎 "bit" 比必要的更隐蔽(哈哈哈 ;))。
在C2011中,有_Alignas
and _Alignof
keywords, the header <stdalign.h>
which makes their use slightly less ugly, and the type max_align_t
(在<stddef.h>
中)。例如,您可以写
double _Alignas(4*_Alignof(double)) dvector[16];
请求一个包含 16 个 double
数量的数组,对齐方式为 double
的通常对齐方式的 4 倍,这对于与 CPU 特定向量指令一起使用可能是必要的。这不能保证对所有实现都有效,但如果它不起作用,则保证是编译时错误。
在 C2011 之前,没有标准 方法来执行此操作,但许多编译器确实具有具有类似功能的扩展,例如GCC 的 __attribute__ (aligned)
结构。
我想到了工会。
union This
{
int integer;
align_type alignment;
} ;
联合中的成员之前没有填充。因此,如果您声明一个自动变量 union This
,那么它及其所有成员的对齐方式应与具有最高对齐方式的成员的对齐方式相同。