在C中,有没有办法在堆栈上过度对齐(即比从类型系统推断的更多对齐)?
对于动态分配内存中的变量,如果其他所有内容都失败,我们总是可以手动对齐,但是对于自动分配的内存中的变量可以做些什么呢?
我想可以使用char[size + alignment - 1]
然后总是使用位操作来访问变量,但这看起来比必要的更“阴影”(har har har;))。
答案 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
,那么它及其所有成员应该与具有最高对齐的成员的对齐方式对齐。