alignas 说明符 (C++11 起)

来自cppreference.com
< cpp‎ | language


 
 
C++ 语言
 
 

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

语法

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) 查询类型的对齐要求
获取类型的对齐要求
(类模板)