C语言结构体对齐
主要用于优化内存访问效率和跨平台兼容性,对齐规则决定了结构体成员在内存中的存储方式。
对齐规则
- 每个成员的起始地址必须是该成员类型大小的整数倍,比如,int的起始地址通常必须是4的倍数
- 结构体的总大小必须是其最大成员类型大小的整数倍
- 可通过#pragma pack或__attribute__((packed))取消默认对齐,按1Byte紧凑排列
(1)内存浪费:
struct Example1 {char a; // 1字节,起始地址0int b; // 4字节,需对齐到4的倍数 → 起始地址4(填充3字节)short c; // 2字节,起始地址8// 总大小:1(a) + 3(填充) + 4(b) + 2(c) = 10字节// 整体对齐:10不是4的倍数 → 填充2字节,最终大小12字节
};
(2)优化顺序:
struct Example2 {int b; // 4字节,起始地址0short c; // 2字节,起始地址4char a; // 1字节,起始地址6// 总大小:4(b) + 2(c) + 1(a) = 7字节// 整体对齐:7不是4的倍数 → 填充1字节,最终大小8字节
};
(3)紧凑对齐
struct __attribute__((packed)) PackedExample {char a; // 1字节,起始地址0int b; // 4字节,起始地址1(无填充)short c; // 2字节,起始地址5// 总大小:1(a) + 4(b) + 2(c) = 7字节(无需整体对齐)
};
C语言结构体对齐https://mp.weixin.qq.com/s/fwf9bywhVtR1yhKDP0vGJA