命名空间
变体
操作

alignas 说明符 (自 C++11 起)

来自 cppreference.com
< cpp‎ | language
 
 
C++ 语言
一般主题
流程控制
条件执行语句
if
迭代语句(循环)
for
range-for (C++11)
跳转语句
函数
函数声明
Lambda 函数表达式
inline 说明符
动态异常规范 (已弃用至 C++17*)
noexcept 说明符 (C++11)
异常
命名空间
类型
说明符
const/volatile
decltype (C++11)
auto (C++11)
constexpr (C++11)
consteval (C++20)
constinit (C++20)
存储持续时间说明符
初始化
 
 

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

内容

[编辑] 语法

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

[编辑] 解释

alignas 说明符可以应用于

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

通过此类声明声明的对象或类型将具有与其 对齐要求 相等的严格(最大)非零 表达式,除非它会削弱类型的自然对齐方式。

如果声明中最严格的(最大)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++ 标准。

DR 应用于 已发布的行为 正确的行为
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