1. 什么是内存对齐
内存对齐(Memory Alignment)是指数据在内存中的存储地址必须是某个值的整数倍(通常是 2、4、8 等 2 的幂次方)。现代计算机体系结构对内存访问进行了优化,要求特定类型的数据必须从特定倍数的地址开始存储。
2. 为什么需要内存对齐
2.1 硬件要求
- CPU 访问效率:多数 CPU 访问对齐的数据只需要一个总线周期,而非对齐访问可能需要多个周期。
- 硬件支持:某些架构(如 ARM)完全不允许非对齐访问,会导致硬件异常。
2.2 性能优化
- 缓存行优化:对齐数据能更好地利用 CPU 缓存。
- SIMD 指令:许多 SIMD 指令(如 SSE/AVX)要求数据必须对齐。
2.3 跨平台兼容
- 不同平台可能有不同的对齐要求。
3. 对齐规则详解
3.1 基本数据类型的自然对齐
char:1 字节对齐short:2 字节对齐int/float:4 字节对齐double/long long:8 字节对齐(32 位系统可能为 4 字节)- 指针:4 字节(32 位)或 8 字节(64 位)对齐
3.2 结构体的对齐规则
- 结构体的对齐要求是其成员中最大对齐要求的那个值。
- 结构体的大小必须是其对齐要求的整数倍。
- 每个成员的偏移量必须是其自身对齐值的整数倍。
struct Example1 {
char a; // 1 字节
int b; // 4 字节(需要从 4 的倍数地址开始)
short c; // 2 字节
}; // 大小可能是 12 字节(1 + 3 填充 + 4 + 2 + 2 填充)
3.3 联合体 (union) 的对齐
- 对齐要求等于其最大成员的对齐要求。
- 大小等于最大成员的大小(向上对齐)。
4. 结构体成员排列优化
通过合理排列成员顺序可以节省内存:
// 优化前 (12 字节)
struct bad_layout {
char a;
int b;
short c;
};
// 优化后 (8 字节)
struct {
b;
a;
c;
};

