_Alignas (自 C11 起)(在 C23 中已弃用), alignas (自 C23 起)
来自 cppreference.cn
出现在声明语法中,作为类型说明符之一,用于修改被声明对象的对齐要求。
目录 |
[编辑] 语法
_Alignas ( expression ) |
(1) | (自 C11 起) | |||||||
alignas ( expression ) |
(2) | (自 C23 起) | |||||||
_Alignas ( type ) |
(3) | (自 C11 起) | |||||||
alignas ( type ) |
(4) | (自 C23 起) | |||||||
expression | - | 任何整型常量表达式,其值是有效的对齐或零 |
type | - | 任何类型名称 |
关键字 |
(直到 C23) |
[编辑] 解释
_Alignas
(直到 C23)alignas
(自 C23 起) 说明符只能在声明非位域且没有 register 存储类的对象时使用。它不能用于函数参数声明,也不能用于 typedef 中。
当在声明中使用时,声明的对象的对齐要求将被设置为
1,2) expression 的结果,除非它为零
3,4) type 的对齐要求,即 _Alignof(type)(直到 C23)alignof(type)(自 C23 起)
除非这会削弱类型自然拥有的对齐方式。
如果 expression 的计算结果为零,则此说明符无效。
当同一个声明中出现多个 _Alignas
(直到 C23)alignas
(自 C23 起) 说明符时,将使用最严格的一个。
_Alignas
(直到 C23)alignas
(自 C23 起) 说明符只需要出现在对象的定义上,但如果任何声明使用 _Alignas
(直到 C23)alignas
(自 C23 起),它必须指定与定义上的 _Alignas
(直到 C23)alignas
(自 C23 起) 相同的对齐方式。如果不同的翻译单元为同一对象指定不同的对齐方式,则行为未定义。
[编辑] 注释
在 C++ 中,alignas
说明符也可以应用于类/结构体/联合体类型和枚举的声明。C 语言不支持这一点,但可以通过在成员声明中使用 _Alignas
(直到 C23)alignas
(自 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 对齐说明符 (页码: 待定)
- 6.2.8 对象对齐 (页码: 待定)
- 7.15 对齐 <stdalign.h> (页码: 待定)
- C17 标准 (ISO/IEC 9899:2018)
- 6.7.5 对齐说明符 (页码: 92)
- 6.2.8 对象对齐 (页码: 36-37)
- 7.15 对齐 <stdalign.h> (页码: 196)
- C11 标准 (ISO/IEC 9899:2011)
- 6.7.5 对齐说明符 (页码: 127-128)
- 6.2.8 对象对齐 (页码: 48-49)
- 7.15 对齐 <stdalign.h> (页码: 268)
[编辑] 另请参阅
(C11) |
一种对齐要求与任何其他标量类型一样大的类型 (typedef) |
_Alignof(直到 C23)alignof(自 C23 起) | 查询对象的对齐要求 (运算符) |