Namespaces
Variants

_Alignas (since C11) (deprecated in C23) , alignas (since C23)

From cppreference.net

声明 语法中作为类型说明符出现,用于修改所声明对象的 对齐要求

目录

语法

_Alignas ( 表达式 ) (1) (自 C11 起)
alignas ( 表达式 ) (2) (自 C23 起)
_Alignas ( 类型 ) (3) (自 C11 起)
alignas ( 类型 ) (4) (自 C23 起)
expression - 值为有效 对齐方式 或零的任意 整型常量表达式
type - 任意 类型名称

关键字 _Alignas 也可作为便捷宏 alignas 使用,该宏可在头文件 <stdalign.h> 中找到。

(C23 前)

说明

_Alignas (C23前) alignas (C23起) 说明符仅可用于声明非 位域 对象,且不能具有 register 存储类。它不能用于函数参数声明,也不能用于 typedef。

当在声明中使用时,被声明对象将具有其 对齐要求 设置为

1,2) 表达式 的结果,除非该结果为零
3,4) type 的对齐要求,即 _Alignof ( type ) (C23前) alignof ( type ) (C23起)

除非这会削弱该类型原本应有的对齐方式。

如果 expression 的计算结果为零,此说明符不产生任何效果。

当同一个声明中出现多个 _Alignas (C23前) alignas (C23起) 说明符时,将采用最严格的那个。

_Alignas (C23前) alignas (C23起) 说明符仅需出现在对象的 定义 中,但若任何声明使用了 _Alignas (C23前) alignas (C23起) ,则必须指定与定义中的 _Alignas (C23前) alignas (C23起) 相同的对齐要求。若不同翻译单元对同一对象指定了不同的对齐方式,则行为未定义。

注释

在C++中, alignas 说明符也可应用于类/结构体/联合类型及枚举的声明。C语言不支持此特性,但可通过在成员声明中使用 _Alignas (C23前) alignas (C23起) 来控制结构体类型的对齐方式。

关键词

alignas , _Alignas

示例

#include <stdalign.h>
#include <stdio.h>
// 每个 struct sse_t 类型的对象将按 16 字节边界对齐
//(注意:需要支持 DR 444)
struct sse_t
{
    alignas(16) float sse_data[4];
};
// 每个 struct data 类型的对象将按 128 字节边界对齐
struct data
{
    char x;
    alignas(128) char cacheline[128]; // 过度对齐的字符数组,
                                      // 而非过度对齐字符的数组
};
int main(void)
{
    printf("sizeof(data) = %zu (1 byte + 127 bytes padding + 128-byte array)\n",
           sizeof(struct data));
    printf("alignment of sse_t is %zu\n", alignof(struct sse_t));
    alignas(2048) struct data d; // 此 data 实例的对齐要求更为严格
    (void)d; // 抑制“可能未使用”警告
}

输出:

sizeof(data) = 256 (1 byte + 127 bytes padding + 128-byte array)
alignment of sse_t is 16

缺陷报告

下列行为变更缺陷报告被追溯应用于先前发布的C语言标准。

DR 适用范围 发布时的行为 正确行为
DR 444 C11 _Alignas 不允许用于结构和联合成员 允许使用

参考文献

  • C23 标准 (ISO/IEC 9899:2024):
  • 6.7.5 对齐说明符 (p: TBD)
  • 6.2.8 对象的对齐 (p: TBD)
  • 7.15 对齐 <stdalign.h> (p: TBD)
  • C17 标准 (ISO/IEC 9899:2018):
  • 6.7.5 对齐说明符 (p: 92)
  • 6.2.8 对象的对齐 (p: 36-37)
  • 7.15 对齐 <stdalign.h> (p: 196)
  • C11 标准 (ISO/IEC 9899:2011):
  • 6.7.5 对齐说明符 (p: 127-128)
  • 6.2.8 对象的对齐 (p: 48-49)
  • 7.15 对齐 <stdalign.h> (p: 268)

参见

对齐要求与任何其他标量类型同样严格的对象类型
(typedef)
_Alignof (until C23) alignof (since C23) 查询对象的对齐要求
(运算符)
C++ 文档 关于 alignas 说明符