alignas
specifier
(since C++11)
指定类型或对象的 对齐要求 。
目录 |
语法
alignas(
表达式
)
|
|||||||||
alignas(
类型标识
)
|
|||||||||
alignas(
包
...
)
|
|||||||||
说明
alignas 说明符可应用于:
- 类 的声明或定义;
- 非位域类数据成员的声明;
-
变量的声明,但以下情况除外:
- 函数参数;
- catch子句的异常参数。
通过此类声明所声明的对象或类型,其
对齐要求
将等于声明中使用的所有
alignas
说明符中最严格(最大)的非零
表达式
,除非这会削弱类型的自然对齐。
如果声明中最严格(最大)的
alignas
对齐要求弱于未使用任何
alignas
说明符时的对齐方式(即弱于其自然对齐要求,或弱于同一对象或类型的其他声明中的
alignas
要求),则程序非良构:
struct alignas(8) S {}; struct alignas(1) U { S s; }; // 错误:若不使用 alignas(1),U 的对齐方式本应为 8
无效的非零对齐方式,例如 alignas ( 3 ) 属于格式错误。
同一声明中比另一个 alignas 更弱的有效非零对齐将被忽略。
alignas ( 0 ) 始终被忽略。
注释
截至ISO C11标准,C语言引入了 _Alignas 关键字,并在头文件 <stdalign.h> 中将 alignas 定义为展开为该关键字的预处理器宏。
在 C++ 中,this 是一个关键字,且
|
头文件 <stdalign.h> 和 <cstdalign> 不定义此类宏。但它们确实定义了宏常量 __alignas_is_defined 。 |
(C++20 前) |
|
头文件 <stdalign.h> 不定义此类宏。但它确实定义了宏常量 __alignas_is_defined 。 |
(C++20 起) |
关键词
示例
#include <iostream> // 每个 struct_float 类型的对象都将对齐到 // alignof(float) 边界(通常为 4): struct alignas(float) struct_float { // 在此处定义您的结构体 }; // 每个 sse_t 类型的对象将对齐到 32 字节边界: 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++标准。
| 缺陷报告 | 适用范围 | 发布时的行为 | 正确行为 |
|---|---|---|---|
| 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
|
|