Namespaces
Variants

alignas specifier (since C++11)

From cppreference.net
C++ language
General topics
Flow control
Conditional execution statements
Iteration statements (loops)
Jump statements
Functions
Function declaration
Lambda function expression
inline specifier
Dynamic exception specifications ( until C++17* )
noexcept specifier (C++11)
Exceptions
Namespaces
Types
Specifiers
constexpr (C++11)
consteval (C++20)
constinit (C++20)
Storage duration specifiers
Initialization
Expressions
Alternative representations
Literals
Boolean - Integer - Floating-point
Character - String - nullptr (C++11)
User-defined (C++11)
Utilities
Attributes (C++11)
Types
typedef declaration
Type alias declaration (C++11)
Casts
Memory allocation
Classes
Class-specific function properties
Special member functions
Templates
Miscellaneous

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

目录

语法

alignas( 表达式 )
alignas( 类型标识 )
alignas( ... )
1) expression 必须是可求值为零,或对 对齐方式 或扩展对齐方式有效的 整型常量表达式
2) 等价于 alignas ( alignof ( type-id ) )
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++ 中,this 是一个关键字,且

头文件 <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 可应用于枚举声明 禁止使用

参考文献

  • 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