6. _Alignof 运算符

_Alignof 运算符 用于在编译阶段返回一个数据类型的对齐字节数(整数常量)。

在 C11 标准之前我们只能靠打印地址的方式来根据经验猜测编译器的对齐方式,在 C11 标准的编译器中提供了 _Alignof 运算符可以返回某种类型数据的对齐字节数。根据这个对齐字节数,我们可以优化程序和结构体字节对齐。

语法:

_Alignof(类型名
// 或
_Alignof(表达式)

示例:

// filename: alignof.c
#include <stdio.h>

struct aaa {
    char c;
    double d;
    int i;
};

struct bbb {
    char c;
    int i;
};

int main(int argc, char * argv[]) {
    char c1;
    short int s1;
    int i1;
    double d1;

    struct aaa a;
    struct bbb b;

    printf("_Alignof(c1): %ld\n", _Alignof(c1));
    printf("_Alignof(s1): %ld\n", _Alignof(s1));
    printf("_Alignof(i1): %ld\n", _Alignof(i1));
    printf("_Alignof(d1): %ld\n", _Alignof(d1));

    printf("_Alignof(char): %ld\n", _Alignof(char));
    printf("_Alignof(short int): %ld\n", _Alignof(short int));
    printf("_Alignof(int): %ld\n", _Alignof(int));
    printf("_Alignof(double): %ld\n", _Alignof(double));

    printf("_Alignof(struct aaa): %ld\n", _Alignof(struct aaa));
    printf("_Alignof(struct bbb): %ld\n", _Alignof(struct bbb));
    printf("_Alignof(a): %ld\n", _Alignof(a));
    printf("_Alignof(b): %ld\n", _Alignof(b));

    printf("sizeof(a): %ld\n", sizeof(a));  // 24,末尾添加填充字节

    return 0;
}

编译和运行结果如下:

weimingze@mzstudio:~$ gcc -o alignof alignof.c -std=c11
weimingze@mzstudio:~$ ./alignof
_Alignof(c1): 1
_Alignof(s1): 2
_Alignof(i1): 4
_Alignof(d1): 8
_Alignof(char): 1
_Alignof(short int): 2
_Alignof(int): 4
_Alignof(double): 8
_Alignof(struct aaa): 8
_Alignof(struct bbb): 4
_Alignof(a): 8
_Alignof(b): 4
sizeof(a): 24

说明:

实验:

分析如下结构体的内存结构。

struct mydata {
    char c;
    double d;
    short int s;
};