命名空间
变体
操作

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

来自 cppreference.cn
< c‎ | language

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

目录

[编辑] 语法

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

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

(直到 C23)

[编辑] 解释

_Alignas(直到 C23)alignas(自 C23 起) 说明符只能在声明非位域且没有 register 存储类的对象时使用。它不能用于函数参数声明,也不能用于 typedef 中。

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

1,2) expression 的结果,除非它为零
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>
 
// 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 应用于 已发布行为 正确行为
DR 444 C11 _Alignas 不允许在结构体和联合体成员中使用 允许

[编辑] 参考文献

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

[编辑] 另请参阅

一种对齐要求与任何其他标量类型一样大的类型
(typedef) [编辑]
_Alignof(直到 C23)alignof(自 C23 起) 查询对象的对齐要求
(运算符)