命名空间
变体
操作

alignas 说明符 (C++11 起)

来自 cppreference.cn
< cpp‎ | 语言
 
 
C++ 语言
表达式
替代表示
字面量
布尔字面量 - 整数字面量 - 浮点数字面量
字符字面量 - 字符串字面量 - nullptr (C++11)
用户定义 (C++11)
工具
属性 (C++11)
类型
typedef 声明
类型别名声明 (C++11)
类型转换
内存分配
类特有的函数属性
explicit (C++11)
static

特殊成员函数
模板
杂项
 
 

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

目录

[编辑] 语法

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

[编辑] 解释

alignas 说明符可应用于

  • 的声明或定义;
  • 非位域类数据成员的声明;
  • 变量的声明,但不能应用于以下情况
    • 函数参数;
    • catch 子句的异常参数。

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

如果声明中最严格(最大)的 alignas 比没有 alignas 说明符的对齐(即比其自然对齐或比同一对象或类型的另一个声明上的 alignas 弱)弱,则程序格式错误。

struct alignas(8) S {};
struct alignas(1) U { S s; }; // error: alignment of U would have been 8 without alignas(1)

无效的非零对齐,例如 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>
 
// Every object of type struct_float will be aligned
// to alignof(float) boundary (usually 4):
struct alignas(float) struct_float
{
    // your definition here
};
 
// Every object of type sse_t will be aligned to 32-byte boundary:
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 文档 用于 _Alignas, alignas