_Alignas (C11 起)(C23 中已弃用), alignas (C23 起)
来自 cppreference.cn
在声明语法中作为类型说明符之一,用于修改正在声明的对象的对齐要求。
目录 |
[编辑] 语法
_Alignas ( 表达式 ) |
(1) | (C11 起) | |||||||
alignas ( 表达式 ) |
(2) | (自 C23 起) | |||||||
_Alignas ( 类型 ) |
(3) | (C11 起) | |||||||
alignas ( 类型 ) |
(4) | (自 C23 起) | |||||||
表达式 | - | 任何整型常量表达式,其值为有效的对齐值或零 |
类型 | - | 任何类型名 |
关键字 |
(直至 C23) |
[编辑] 说明
_Alignas
(C23 前)alignas
(C23 起) 说明符只能用于声明非位域且不具有 register 存储类的对象。它不能用于函数参数声明,也不能用于 typedef。
当用于声明时,所声明对象的对齐要求将被设置为
1,2) 表达式的结果,除非它为零
3,4) 类型的对齐要求,即 _Alignof(type)(C23 前)alignof(type)(C23 起)
除非这会削弱类型自然具有的对齐方式。
如果 表达式 的计算结果为零,则此说明符无效。
当同一声明中出现多个 _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 444 | C11 | 结构体和联合体成员中不允许使用 _Alignas |
允许 |
[编辑] 参考
- C23 标准 (ISO/IEC 9899:2024)
- 6.7.5 对齐说明符(p:待定)
- 6.2.8 对象的对齐方式(p:待定)
- 7.15 对齐 <stdalign.h>(p:待定)
- 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)
[编辑] 另请参阅
(C11) |
与任何其他标量类型具有相同对齐要求的类型 (typedef) |
_Alignof(C23 前)alignof(C23 起) | 查询对象的对齐要求 (运算符) |
C++ 文档,关于
alignas 说明符 |