当前位置: C语言 -- 标准库 -- <stdalign.h> -- alignas

alignas宏


概要:

该宏在<stdalign.h>头文件中定义,扩展为C语言关键词_Alignas

#define alignas _Alignas


关键词_Alignas的语法:

_Alignas(type-name)

_Alignas(constant-expression)


描述:

第一种形式等价于_Alignas(_Alignof(type-name))

第二种形式中constant-expression应为整数常量表达式。constant-expression应为有效的基本对齐,或者为声明存储期限(如果有)的对象的实现支持的有效扩展对齐, 或者为0

声明的对象或者成员的对齐要求视为是指定的对齐。0对齐没有任何效果;0对齐也不会影响同一声明中的其它对齐。当一个声明中出现多个对齐说明符时,有效对齐是要求最严格的对齐。


对齐说明符只能出现在声明的声明说明符中,或者成员声明的说明符-限定符列表中,或者复合字面量(compound literal)的类型名中。对齐说明符不能与存储类说明符typedef或者register一起使用,不能用于函数或者位字段(bit-field)的声明。

如果对象的定义存在对齐说明符,则该对象的任何其它声明应指定等价的对齐说明符或者没有对齐说明符。如果对象的定义没有对齐说明符,该对象的任何其它声明也应该没有对齐说明符。如果一个对象的声明在不同的编译单元中具有不同的对齐说明符,其行为是未定义的。


声明中所有对齐说明符的综合效果指定对齐的严格程度不得低于声明的对象或者成员的类型所要求的对齐。

对于具有某种存储期限的对象,如果实现不支持其扩展对齐,则不应该使用过度对齐类型声明该对象。


范例:
1 
2 
3 
4 
5 
6 
7 
8 
9 
10 
11 
12 
13 
14 
15 
16 
17 
18 
19 
20 
21 
22 
23 
24 
25 
26 
27 
28 
29 
/*宏alignas范例*/

#include <stdalign.h>
#include <stddef.h>
#include <stdio.h>

struct data {
    char str[6];
    int a;
    alignas(16) double b;
    double c;
    int d;
};

int main(void)
{
    printf("sizeof(struct data): %zu\n", sizeof(struct data));
    printf("sizeof(char): %zu\n", sizeof(char));
    printf("sizeof(int): %zu\n", sizeof(int));
    printf("sizeof(double): %zu\n", sizeof(double));
    printf("offsetof(struct data, str): %zu\n", offsetof(struct data, str));
    printf("offsetof(struct data, a): %zu\n", offsetof(struct data, a));
    printf("offsetof(struct data, b): %zu\n", offsetof(struct data, b));
    printf("offsetof(struct data, c): %zu\n", offsetof(struct data, c));
    printf("offsetof(struct data, d): %zu\n", offsetof(struct data, d));

    return 0;
}

输出:

sizeof(struct data): 48

sizeof(char): 1

sizeof(int): 4

sizeof(double): 8

offsetof(struct data, str): 0

offsetof(struct data, a): 8

offsetof(struct data, b): 16

offsetof(struct data, c): 24

offsetof(struct data, d): 32


相关内容:
alignof 扩展为关键词_Alignof的宏。
__alignas_is_defined 判断是否定义alignas的宏。