#C 语言标准库头文件 stdalign.h
这个头文件提供 内存对齐 的相关功能。
#示例
#include <stdio.h>
#include <stdalign.h> // 提供 alignas, alignof, __alignas_is_defined, __alignof_is_defined 等宏
struct data {
char c;
alignas(16) int arr[4]; // arr 数组将按 16 字节对齐
};
int main(void) {
// 检查编译器是否支持对齐特性
#ifdef __alignas_is_defined
printf("编译器支持 alignas\n");
#endif
#ifdef __alignof_is_defined
printf("编译器支持 alignof\n");
#endif
// 使用 alignof 获取类型的对齐要求
printf("char 的对齐长度为: %zu 字节\n", alignof(char));
printf("int 的对齐长度为: %zu 字节\n", alignof(int));
printf("double 的对齐长度为: %zu 字节\n", alignof(double));
printf("struct data 的对齐长度为: %zu 字节\n", alignof(struct data));
// 使用alignas指定对齐
alignas(32) int x; // x 将按32字节对齐
printf("x 的地址为: %p (按 32 字节对齐)\n", (void*)&x);
// 检查结构体成员的对齐
struct data d;
printf("d.arr 的地址为: %p (按 16 字节对齐)\n", (void*)&d.arr);
return 0;
}
运行结果:
编译器支持 alignas 编译器支持 alignof char 的对齐长度为: 1 字节 int 的对齐长度为: 4 字节 double 的对齐长度为: 8 字节 struct data 的对齐长度为: 16 字节 x 的地址为: 0x7ffc77626660 (按 32 字节对齐) d.arr 的地址为: 0x7ffc77626680 (按 16 字节对齐)
#宏
宏 | 标准 | 说明 |
---|---|---|
alignas | C11(在 C23 废弃) | 定义为关键字 _Alignas |
alignof | C11(在 C23 废弃) | 定义为关键字 _Alignof |
#常量
常量 | 标准 | 说明 |
---|---|---|
__alignas_is_defined | C11(在 C23 废弃) | 表示定义了 alignas |
__alignof_is_defined | C11(在 C23 废弃) | 表示定义了 _Alignof |