命名空间
变体
操作

_Alignas (C11 起)(C23 中已弃用), alignas (C23 起)

来自 cppreference.cn
< c‎ | 语言

声明语法中作为类型说明符之一,用于修改正在声明的对象的对齐要求

目录

[编辑] 语法

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

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

(直至 C23)

[编辑] 说明

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

当用于声明时,所声明对象的对齐要求将被设置为

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

除非这会削弱类型自然具有的对齐方式。

如果 表达式 的计算结果为零,则此说明符无效。

当同一声明中出现多个 _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>
 
// every object of type struct sse_t will be aligned to 16-byte boundary
// (note: needs support for DR 444)
struct sse_t
{
    alignas(16) float sse_data[4];
};
 
// every object of type struct data will be aligned to 128-byte boundary
struct data
{
    char x;
    alignas(128) char cacheline[128]; // over-aligned array of char,
                                      // not array of over-aligned chars
};
 
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; // this instance of data is aligned even stricter
    (void)d; // suppresses "maybe unused" warning
}

输出

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

[编辑] 缺陷报告

以下行为改变的缺陷报告被追溯地应用于以前发布的 C 标准。

缺陷报告 应用于 发布时的行为 正确的行为
DR 444 C11 结构体和联合体成员中不允许使用 _Alignas 允许

[编辑] 参考

  • C23 标准 (ISO/IEC 9899:2024)
  • 6.7.5 对齐说明符(p:待定)
  • 6.2.8 对象的对齐方式(p:待定)
  • 7.15 对齐 <stdalign.h>(p:待定)
  • 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(C23 前)alignof(C23 起) 查询对象的对齐要求
(运算符)
C++ 文档,关于 alignas 说明符