首页
学习
活动
专区
工具
TVP
发布
精选内容/技术社群/优惠产品,尽在小程序
立即前往

alignas

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

句法

_Alignas ( expression )

(1)

(since C11)

_Alignas ( type )

(2)

(since C11)

expression

-

any integer constant expression whose value is a valid alignment or zero

type

-

any type name

此关键字也可用作方便宏alignas,可在标题中找到<stdalign.h>

说明

只有在声明不是位域的对象时才能使用 alignas 说明符,并且不具有寄存器存储类。它不能在函数参数声明中使用,并且不能在 typedef 中使用。

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

1)表达式的结果,除非它为零

2)对类型的对齐要求,即对 alignof(type)

除非这会削弱这种类型自然产生的对齐。

如果表达式计算为零,则此说明符不起作用。

当多个 alignas 说明符出现在同一个声明中时,将使用最严格的一个。

Alignas 说明符只需要出现在对象的定义上,但是如果任何声明使用了 alignas,它必须指定与定义上的 alignas 相同的对齐方式。如果不同的翻译单元为同一对象指定不同的对齐,则行为是不确定的。

注意

如最初公布的那样,C11 不允许结构和工会成员使用 alignas 规范; 这由 DR 444纠正了。

在 C ++中,说明alignas符也可以应用于类/结构体/联合体类型和枚举的声明。这在 C 中不受支持,但可以通过在成员声明中使用 alignas 来控制结构类型的对齐方式(自 DR 444起)。

关键词

_Alignas.

代码语言:javascript
复制
#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
}

输出:

代码语言:javascript
复制
sizeof(data) = 256 (1 byte + 127 bytes padding + 128-byte array)
alignment of sse_t is 16

参考

  • C11标准(ISO / IEC 9899:2011):
    • 6.7.5对齐说明符
    • 6.2.8对象对齐(p:48-49)
    • 7.15对齐<stdalign.h>(p:268)

扫码关注腾讯云开发者

领取腾讯云代金券

http://www.vxiaotou.com