_Alignas (since C11) (deprecated in C23) , alignas (since C23)
在 声明 语法中作为类型说明符出现,用于修改所声明对象的 对齐要求 。
目录 |
语法
_Alignas
(
表达式
)
|
(1) | (自 C11 起) | |||||||
alignas
(
表达式
)
|
(2) | (自 C23 起) | |||||||
_Alignas
(
类型
)
|
(3) | (自 C11 起) | |||||||
alignas
(
类型
)
|
(4) | (自 C23 起) | |||||||
| expression | - | 值为有效 对齐方式 或零的任意 整型常量表达式 |
| type | - | 任意 类型名称 |
|
关键字
|
(C23 前) |
说明
_Alignas
(C23前)
alignas
(C23起)
说明符仅可用于声明非
位域
对象,且不能具有
register
存储类。它不能用于函数参数声明,也不能用于 typedef。
当在声明中使用时,被声明对象将具有其 对齐要求 设置为
除非这会削弱该类型原本应有的对齐方式。
如果 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> // 每个 struct sse_t 类型的对象将按 16 字节边界对齐 //(注意:需要支持 DR 444) struct sse_t { alignas(16) float sse_data[4]; }; // 每个 struct data 类型的对象将按 128 字节边界对齐 struct data { char x; alignas(128) char cacheline[128]; // 过度对齐的字符数组, // 而非过度对齐字符的数组 }; 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; // 此 data 实例的对齐要求更为严格 (void)d; // 抑制“可能未使用”警告 }
输出:
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)
参见
|
(C11)
|
对齐要求与任何其他标量类型同样严格的对象类型
(typedef) |
| _Alignof (until C23) alignof (since C23) |
查询对象的对齐要求
(运算符) |
|
C++ 文档
关于
alignas
说明符
|
|