指定类型或对象的对齐要求

语法

alignas( 表达式 )
alignas( 类型标识 )
alignas( )

1) alignas(表达式) 必须是求值为零或合法的对齐或扩展对齐的整型常量表达式

2) 等价于 alignas(alignof(类型))

3) 等价于对同一说明应用多个 alignas 说明符,逐个对应于形参包的各个成员,形参包可以是类型或非类型形参包。

解释

alignas 说明符可应用于变量或非位域类数据成员的声明,或可应用于 class/struct/union枚举的定义。它不能应用于函数形参或 catch 子句的异常形参。

这种声明所声明的对象或类型的对齐要求,将等于用于该声明的所有 alignas 说明符中最严格(最大)的非零 表达式,除非这会削弱类型的自然对齐。

若某个声明上的最严格(最大)alignas,比当它没有任何 alignas 说明符的情况下本应有的对齐更弱(即弱于其原生对齐,或弱于同一对象或类型的另一声明上的 alignas),则程序非良构:

  1. struct alignas(8) S {};
  2. 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>](https://zh.cppreference.com/w/cpp/header#.E6.97.A0.E6.84.8F.E4.B9.89.E7.9A.84_C.E5.A4.B4.E6.96.87.E4.BB.B6) 与 <cstdalign> 并不定义这个宏。不过它们仍定义宏常量 __alignas_is_defined。

关键词

alignas

示例

运行此代码

  1. // sse_t 类型的每个对象将对齐到 16 字节边界
  2. struct alignas(16) sse_t
  3. {
  4. float sse_data[4];
  5. };
  6.  
  7. // 数组 "cacheline" 将对齐到 128字节边界
  8. alignas(128) char cacheline[128];
  9.  
  10.  
  11. int main()
  12. {
  13. }