c语言结构体字节对齐
在 C 语言中,结构体字节对齐(Structure Padding or Alignment)是一种为了提高访问效率而自动插入的空字节(padding bytes)机制。以下是详细解释:
🔧 为什么需要字节对齐
现代处理器通常对特定的数据类型有对齐要求,比如:
int
通常需要按 4 字节对齐;short
通常需要按 2 字节对齐;char
通常对齐要求最低(1 字节);
未对齐访问可能会带来性能下降,甚至在某些架构(如 ARM)中直接报错。
📐 对齐规则
结构体成员的地址应满足其类型的对齐要求。C 编译器通常遵循以下规则:
结构体每个成员的地址必须是其类型对齐大小的倍数。
结构体的总大小是其最大对齐单位的倍数。
必要时在成员之间或末尾填充空字节。
🧪 示例讲解
#include <stdio.h>struct A {char a; // 1字节int b; // 4字节short c; // 2字节
};
计算大小:
char a
占 1 字节;int b
需要从 4 字节对齐位置开始,因此填充 3 字节(padding);int b
占 4 字节;short c
需要 2 字节对齐,没问题;结构体最大对齐单位是 4(因为 int),所以最后再填充 2 字节使总长度是 4 的倍数。
🔹 最终大小:12 字节
📦 结构体对齐控制方式
1. 使用 #pragma pack(n)
#pragma pack(1) // 取消对齐,所有成员按 1 字节对齐struct A {char a;int b;short c;
};
#pragma pack() // 恢复默认对齐
🔸 此时结构体大小为 7 字节(无填充)。
2. 使用 __attribute__((packed))
(GCC)
struct __attribute__((packed)) A {char a;int b;short c;
};
效果同 #pragma pack(1)
,所有成员紧凑排列。
📊 如何查看结构体大小
可以使用 sizeof
运算符:
printf("sizeof(struct A) = %lu\n", sizeof(struct A));
✅ 小结
对齐方式 | 优点 | 缺点 |
---|---|---|
默认对齐(性能优先) | 访问速度快 | 空间浪费(有填充) |
取消对齐(空间优先) | 节省空间 | 访问慢,或可能非法访问 |
根据具体场景(性能 vs 空间)选择是否开启对齐控制。
如需示例测试代码或可视化内存布局,我可以为你补充。