命名空间
变体
操作

_Alignas (自 C11 起), alignas (自 C23 起)

来自 cppreference.com
< c‎ | 语言

出现在 声明 语法中,作为类型说明符之一,用于修改被声明对象的 对齐要求

内容

[编辑] 语法

_Alignas ( 表达式 ) (1) (自 C11 起)
alignas ( 表达式 ) (2) (自 C23 起)
_Alignas ( 类型 ) (3) (自 C11 起)
alignas ( 类型 ) (4) (自 C23 起)
表达式 - 任何 整型常量表达式,其值为有效的 对齐 或零
类型 - 任何 类型名称

关键字 _Alignas 也可以作为便捷宏 alignas 使用,它在头文件 <stdalign.h> 中可用。

(直到 C23)

[编辑] 解释

The _Alignas(until C23)alignas(since C23) specifier can only be used when declaring objects that are not bit-fields, and don't have the register storage class. It cannot be used in function parameter declarations, and cannot be used in a typedef.

当在声明中使用时,声明的对象将具有其 对齐要求 设置为

1,2) 表达式 的结果,除非它为零
3,4) 类型 的对齐要求,即 _Alignof(type)(until C23)alignof(type)(since C23)

除非这会削弱该类型自然具有的对齐。

如果 表达式 评估为零,则此说明符没有效果。

当在同一个声明中出现多个 _Alignas(until C23)alignas(since C23) 说明符时,将使用最严格的一个。

_Alignas(until C23)alignas(since C23) 说明符只需要出现在对象的 定义 中,但如果任何声明使用 _Alignas(until C23)alignas(since C23),它必须指定与定义中的 _Alignas(until C23)alignas(since C23) 相同的对齐。如果不同的翻译单元为同一个对象指定了不同的对齐,则行为是未定义的。

[编辑] 说明

在 C++ 中,alignas 说明符也可以应用于类/结构体/联合体类型和枚举类型的声明。C 不支持这一点,但可以通过在成员声明中使用 _Alignas(until C23)alignas(since C23) 来控制结构体类型的对齐。

[编辑] 关键字

alignas, _Alignas

[编辑] 示例

#include <stdalign.h>
#include <stdio.h>
 
// every object of type struct sse_t will be aligned to 16-byte boundary
// (note: needs support for DR 444)
struct sse_t
{
    alignas(16) float sse_data[4];
};
 
// every object of type struct data will be aligned to 128-byte boundary
struct data
{
    char x;
    alignas(128) char cacheline[128]; // over-aligned array of char,
                                      // not array of over-aligned chars
};
 
int main(void)
{
    printf("sizeof(data) = %zu (1 byte + 127 bytes padding + 128-byte array)\n",
           sizeof(struct data));
 
    printf("alignment of sse_t is %zu\n", alignof(struct sse_t));
 
    alignas(2048) struct data d; // this instance of data is aligned even stricter
    (void)d; // suppresses "maybe unused" warning
}

输出

sizeof(data) = 256 (1 byte + 127 bytes padding + 128-byte array)
alignment of sse_t is 16

[编辑] 缺陷报告

以下行为变更缺陷报告已追溯应用于先前发布的 C 标准。

DR 应用于 发布的行为 正确行为
DR 444 C11 _Alignas 不允许在结构体和联合体成员中使用 允许

[编辑] 参考资料

  • C23 标准 (ISO/IEC 9899:2024)
  • 6.7.5 对齐说明符 (p: TBD)
  • 6.2.8 对象的对齐 (p: TBD)
  • 7.15 对齐 <stdalign.h> (p: TBD)
  • C17 标准 (ISO/IEC 9899:2018)
  • 6.7.5 对齐说明符 (p: 92)
  • 6.2.8 对象的对齐 (p: 36-37)
  • 7.15 对齐 <stdalign.h> (p: 196)
  • C11 标准 (ISO/IEC 9899:2011)
  • 6.7.5 对齐说明符 (p: 127-128)
  • 6.2.8 对象的对齐 (p: 48-49)
  • 7.15 对齐 <stdalign.h> (p: 268)

[编辑] 另请参见

C++ 文档 for alignas 说明符