alignas
说明符 (自 C++11 起)
来自 cppreference.com
指定 对齐要求 类型或对象。
内容 |
[编辑] 语法
alignas( 表达式 ) |
|||||||||
alignas( 类型标识符 ) |
|||||||||
alignas( 包 ... ) |
|||||||||
2) 等效于 alignas(alignof( 类型标识符 )).
3) 等效于对同一声明应用多个 alignas 说明符,每个说明符对应于 参数包 的每个成员,参数包可以是类型参数包或非类型参数包。
[编辑] 解释
alignas 说明符可以应用于
- 类 的声明或定义;
- 非位域类数据成员的声明;
- 变量的声明,但它不能应用于以下情况
- 函数参数;
- catch 子句的异常参数。
通过此类声明声明的对象或类型将具有与其 对齐要求 相等的严格(最大)非零 表达式,除非它会削弱类型的自然对齐方式。
如果声明中最严格的(最大)alignas
比没有任何alignas
说明符时的对齐方式更弱(即,比其自然对齐方式更弱或比同一对象或类型的另一个声明上的alignas
更弱),则程序是格式错误的。
struct alignas(8) S {}; struct alignas(1) U { S s; }; // error: alignment of U would have been 8 without alignas(1)
无效的非零对齐方式,例如 alignas(3) 是格式错误的。
比同一声明上的另一个 alignas 更弱的有效非零对齐方式将被忽略。
alignas(0) 始终会被忽略。
[编辑] 注释
根据 ISO C11 标准,C 语言包含 _Alignas 关键字,并在头文件 <stdalign.h> 中定义 alignas 作为预处理宏,扩展为该关键字。
在 C++ 中,这是一个关键字,并且
头文件 <stdalign.h> 和 <cstdalign> 没有定义此类宏。但是,它们定义了宏常量 __alignas_is_defined。 |
(直到 C++20) |
头文件 <stdalign.h> 没有定义此类宏。但是,它定义了宏常量 __alignas_is_defined。 |
(从 C++20 开始) |
[编辑] 关键字
[编辑] 示例
运行这段代码
#include <iostream> // Every object of type struct_float will be aligned // to alignof(float) boundary (usually 4): struct alignas(float) struct_float { // your definition here }; // Every object of type sse_t will be aligned to 32-byte boundary: struct alignas(32) sse_t { float sse_data[4]; }; int main() { struct default_aligned { float data[4]; } a, b, c; sse_t x, y, z; std::cout << "alignof(struct_float) = " << alignof(struct_float) << '\n' << "sizeof(sse_t) = " << sizeof(sse_t) << '\n' << "alignof(sse_t) = " << alignof(sse_t) << '\n' << std::hex << std::showbase << "&a: " << &a << "\n" "&b: " << &b << "\n" "&c: " << &c << "\n" "&x: " << &x << "\n" "&y: " << &y << "\n" "&z: " << &z << '\n'; }
可能的输出
alignof(struct_float) = 4 sizeof(sse_t) = 32 alignof(sse_t) = 32 &a: 0x7fffcec89930 &b: 0x7fffcec89940 &c: 0x7fffcec89950 &x: 0x7fffcec89960 &y: 0x7fffcec89980 &z: 0x7fffcec899a0
[编辑] 缺陷报告
以下更改行为的缺陷报告被追溯地应用于以前发布的 C++ 标准。
DR | 应用于 | 已发布的行为 | 正确的行为 |
---|---|---|---|
CWG 1437 | C++11 | alignas 可用于别名声明 | 禁止 |
CWG 2354 | C++11 | alignas 可用于枚举声明 | 禁止 |
[编辑] 参考
- C++23 标准 (ISO/IEC 14882:2024)
- 9.12.4 依赖属性 [dcl.attr.depend]
- C++20 标准 (ISO/IEC 14882:2020)
- 9.12.3 依赖属性 [dcl.attr.depend]
- C++17 标准 (ISO/IEC 14882:2017)
- 10.6.3 依赖属性 [dcl.attr.depend]
- C++14 标准 (ISO/IEC 14882:2014)
- 7.6.4 依赖属性 [dcl.attr.depend]
- C++11 标准 (ISO/IEC 14882:2011)
- 7.6.4 依赖属性 [dcl.attr.depend]
[编辑] 参见
alignof 运算符(C++11) |
查询类型的对齐要求 |
(C++11) |
获取类型的对齐要求 (类模板) |
C 文档 用于 _Alignas, alignas
|