_Alignas (自 C11 起), alignas (自 C23 起)
出现在 声明 语法中,作为类型说明符之一,用于修改被声明对象的 对齐要求。
内容 |
[编辑] 语法
_Alignas ( 表达式 ) |
(1) | (自 C11 起) | |||||||
alignas ( 表达式 ) |
(2) | (自 C23 起) | |||||||
_Alignas ( 类型 ) |
(3) | (自 C11 起) | |||||||
alignas ( 类型 ) |
(4) | (自 C23 起) | |||||||
表达式 | - | 任何 整型常量表达式,其值为有效的 对齐 或零 |
类型 | - | 任何 类型名称 |
关键字 |
(直到 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.
当在声明中使用时,声明的对象将具有其 对齐要求 设置为
除非这会削弱该类型自然具有的对齐。
如果 表达式 评估为零,则此说明符没有效果。
当在同一个声明中出现多个 _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) 来控制结构体类型的对齐。
[编辑] 关键字
[编辑] 示例
#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 说明符 |