alignas 说明符 (C++11 起)
来自cppreference.com
指定类型或对象的对齐要求。
语法
alignas( 表达式 )
|
|||||||||
alignas( 类型标识 )
|
|||||||||
alignas( 包 ... )
|
|||||||||
2) 等价于 alignas(alignof(类型))
3) 等价于对同一说明应用多个 alignas 说明符,逐个对应于形参包的各个成员,形参包可以是类型或非类型形参包。
解释
alignas 说明符可应用于:
这种声明所声明的对象或类型的对齐要求将等于用于该声明的所有 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++ 中这是关键词,且
头文件 <stdalign.h> 与 <cstdalign> 并不定义这个宏。不过它们仍定义宏常量 __alignas_is_defined。 |
(C++20 前) |
头文件 <stdalign.h> 并不定义这个宏。不过它仍定义宏常量 __alignas_is_defined。 |
(C++20 起) |
关键词
示例
运行此代码
// 每个 struct_float 类型对象都将被对齐到 alignof(float) 边界 // (通常为 4): struct alignas(alignof(float)) struct_float { // 定义在此 }; // sse_t 类型的每个对象将对齐到 32 字节边界 struct alignas(32) sse_t { float sse_data[4]; }; // 数组 "cacheline" 将对齐到 64 字节边界 alignas(64) char cacheline[64]; #include <iostream> 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' << "alignof(cacheline) = " << alignof(alignas(64) char[64]) << '\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 alignof(cacheline) = 64 &a: 0x7fffcec89930 &b: 0x7fffcec89940 &c: 0x7fffcec89950 &x: 0x7fffcec89960 &y: 0x7fffcec89980 &z: 0x7fffcec899a0
参阅
alignof 运算符(C++11)
|
查询类型的对齐要求 |
(C++11) |
获取类型的对齐要求 (类模板) |