alignas 说明符 (C++11 起)

来自cppreference.com
< cpp‎ | language


 
 
 
 

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

目录

[编辑]语法

alignas(表达式)
alignas(类型标识)
alignas(包名...)
1)表达式 必须是求值为零或合法的对齐或扩展对齐的整数常量表达式
2) 等价于 alignas(alignof(类型标识))
3) 等价于对同一说明应用多个 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++ 中这是关键词,且

头文件 <stdalign.h><cstdalign> 并不定义这个宏。不过它们仍定义宏常量 __alignas_is_defined

(C++20 前)

头文件 <stdalign.h> 并不定义这个宏。不过它仍定义宏常量 __alignas_is_defined

(C++20 起)

[编辑]关键词

alignas

[编辑]示例

#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 可以用于枚举声明 已禁止

[编辑]References

  • C++23 标准(ISO/IEC 14882:2024):
  • 9.12.4 Carries dependency attribute [dcl.attr.depend]
  • C++20 标准(ISO/IEC 14882:2020):
  • 9.12.3 Carries dependency attribute [dcl.attr.depend]
  • C++17 标准(ISO/IEC 14882:2017):
  • 10.6.3 Carries dependency attribute [dcl.attr.depend]
  • C++14 标准(ISO/IEC 14882:2014):
  • 7.6.4 Carries dependency attribute [dcl.attr.depend]
  • C++11 标准(ISO/IEC 14882:2011):
  • 7.6.4 Carries dependency attribute [dcl.attr.depend]

[编辑]参阅

alignof(C++11) 查询类型的对齐要求
(operator)[编辑]
获取类型的对齐要求
(类模板)[编辑]
_Alignas, alignas 的 C 文档
close