相当于std :: aligned_storage<>在C?

时间:2015-11-11 16:13:24

标签: c++ c alignment c99

在C中,有没有办法在堆栈上过度对齐(即比从类型系统推断的更多对齐)?

对于动态分配内存中的变量,如果其他所有内容都失败,我们总是可以手动对齐,但是对于自动分配的内存中的变量可以做些什么呢?

我想可以使用char[size + alignment - 1]然后总是使用位操作来访问变量,但这看起来比必要的更“阴影”(har har har;))。

2 个答案:

答案 0 :(得分:5)

在C2011中,有_Alignas_Alignof个关键字,标题<stdalign.h>使得它们的使用稍微不那么难看,类型max_align_t(在{ {1}})。例如,您可以编写

<stddef.h>

请求一个16 double _Alignas(4*_Alignof(double)) dvector[16]; 个数组的数组,对齐double的常规对齐方式的4倍,这可能与CPU特定的向量指令一起使用。这不能保证适用于所有实现,但如果它不起作用,则保证它是编译时错误。

在C2011之前,没有标准方法可以做到这一点,但是许多编译器确实具有类似功能的扩展,例如GCC的__attribute__ (aligned)构建。

答案 1 :(得分:5)

好的工会浮现在脑海中。

union This
{
    int integer;
    align_type alignment;
} ;

工会成员之前没有填充。因此,如果您声明一个自动变量union This,那么它及其所有成员应该与具有最高对齐的成员的对齐方式对齐。