C语言中, 每个完整的对象都具有字节对齐要求. 比如基本数据类型一般参照类型本身大小字节对齐, char类型对象按1字节对齐, short类型按2字节对齐等. C11中提供了 查看 和 自定义 对象字节对齐方式的方法. 关于字节对齐见这里
查看对象字节对齐方式:
_Alignof
操作符- 用法:
_Alignof(typename)
返回size_of类型的typename类型对象的对齐方式._Alignof(char)
返回1, 表示char类型对象按1字节对齐. - 注意:
(1) 引用 stdalign.h 头文件后可以直接使用_Alignof对应的宏 alignof
(2) typename 可以是基本类型 枚举类型 结构体 联合体等, 但是必须是类型名(这里存疑, 使用对象名也可以)
(3) 可以使用alignof(max_align_t)
获取当前实现支持的最大对齐方式
- 用法:
自定义对象字节对齐方式:
_Alignas
操作符- 用法:
(1)_Alignas(typename)
将对象声明为按Alignof(_typename)
大小对齐方式对齐. 比如char _Alignas(int) ch;
ch按_Alignof(int)大小对齐.
(2)_Alignas(expression)
将对象声明为按expression
大小对齐方式对齐. 比如char _Alignas(4) ch;
ch按4字节大小对齐. - 注意:
(1) 引用 stdalign.h 头文件后可以直接使用_Alignas对应的宏 alignas
(2) _Alignas操作数指定的字节对齐大小不能小于当前实现默认的对齐大小
(3) _Alignas操作数应该是0, 1, 2, 4或4的倍数等无符号整数, 但不能超过max_align_t的大小
(4) _Alignas(0)表示按默认对齐方式对齐
- 用法:
// 自定义字节对齐方式
#include <sdtio.h>
#include <stdalign.h>
#include <stddef.h>
int main()
{
// 查看字节对齐方式
size_t size = _Alignof(max_align_t);
printf("当期实现支持的最大字节对齐方式: %zu\n", size);
size = alignof(int);
printf("int类型对象默认字节对齐方式: %zu\n", size);
// 自定义字节对齐方式
size = alignof(char);
printf("char类型对象默认字节对齐方式: %zu\n", size);
char _Alignas(int) ch = 'a';
size = alignof(ch);
printf("char类型对象ch自定义字节对齐方式: %zu\n", size);
// 选择选项中最大的字节对齐方式
int alignas(32) alignas(64) alignas(int) n = 0;
size = alignof(n);
printf("int类型对象n自定义字节对齐方式: %zu\n", size);
return 0;
}