【问题标题】:Equivalent of std::aligned_storage<> in C?等效于 C 中的 std::aligned_storage<>?
【发布时间】:2016-02-12 19:08:37
【问题描述】:

在 C 语言中,有没有办法在堆栈上进行过度对齐(即比从类型系统推断出的对齐程度更高)存储?

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

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

【问题讨论】:

  • 你试过 _Alignas 说明符吗?
  • @this 哎呀,我应该提到,没有 C11,谢谢
  • 如果 C11 不是一个选项,你为什么要接受另一个答案? :-(
  • @this 我没有为_Alignas 选择它,而是为最后一段中的建议使用扩展名,因为这是获得可能与现有类型不匹配的任意对齐的唯一方法。尽管它是非标准的,但它是唯一可用的解决方案,并且得到广泛支持。不过,我对这个决定感到很伤心,两个答案都很好。

标签: c++ c alignment c99


【解决方案1】:

在 C2011 中,有 _Alignas_Alignof 关键字,标题 &lt;stdalign.h&gt; 使它们的使用稍微不那么难看,以及类型 max_align_t(在 &lt;stddef.h&gt; 中)。例如,你可以写

double _Alignas(4*_Alignof(double)) dvector[16];

请求一个包含 16 个 double 数量的数组,该数组与 double 的通常对齐方式的 4 倍对齐,这可能是与 CPU 特定的向量指令一起使用所必需的。这不保证适用于所有实现,但如果它不起作用,则保证是编译时错误。

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

【讨论】:

    【解决方案2】:

    想到工会。

    union This
    {
        int integer;
        align_type alignment;
    } ;
    

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

    【讨论】:

      猜你喜欢
      • 2010-09-20
      • 1970-01-01
      • 2015-08-31
      • 2015-03-27
      • 1970-01-01
      • 2013-10-18
      • 2013-03-05
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多