alignas 指定符 (C++11 起)

来自cppreference.com
< cpp‎ | language

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

目录

[编辑] 语法

alignas( expression )
alignas( type-id )
alignas( pack ... )
1) alignas(expression) 必须是求值为零或合法对齐或扩展对齐的整数常量表达式
2) 等价于 alignas(alignof(type))
3) 等价于应用多个 alignas 到同一声明,逐个对应参数包的成员,参数包可以是类型或非类型参数包。

[编辑] 解释

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

以此声明声明的对象或类型的对齐要求将等于用于声明的所有 alignas 指定符最严格(最大)的非零 expression ,除非这会削弱类型的自然对齐。

若声明上的最严格(最大) 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

[编辑] 关键词

alignas

[编辑] 示例

// 每个 sse_t 类型对象将对齐到 16 字节边界
struct alignas(16) sse_t
{
  float sse_data[4];
};
 
// 数组 "cacheline" 将对齐到 128字节边界
alignas(128) char cacheline[128];



[编辑] 参阅

alignof 运算符 查询类型的对齐要求 (C++11 起) [编辑]
获取类型的最小对齐字节数
(类模板) [编辑]
_AlignasC 文档