C语言中结构体对齐和内存填充是如何工作的?
内存对齐原理:
-
对齐规则
- 结构体成员按照其自然边界对齐
- char: 1字节对齐
- short: 2字节对齐
- int: 4字节对齐
- double: 8字节对齐(64位系统)
-
结构体总大小
- 必须是其最大成员大小的整数倍
- 末尾可能需要填充字节
示例分析:
cstruct Example1 { char c; // 1字节 + 3字节填充 int i; // 4字节 }; // 总大小: 8字节 struct Example2 { char c1; // 1字节 + 1字节填充 short s; // 2字节 int i; // 4字节 }; // 总大小: 8字节 struct Example3 { char c1; // 1字节 + 7字节填充 double d; // 8字节 char c2; // 1字节 + 7字节填充 }; // 总大小: 24字节
优化技巧:
-
成员排序优化
- 按大小降序排列成员
- 减少填充字节浪费
-
使用编译器指令
c#pragma pack(1) // 1字节对齐 struct Packed { char c; int i; }; #pragma pack() // 恢复默认对齐 -
位域使用
cstruct BitField { unsigned int a : 3; // 3位 unsigned int b : 5; // 5位 };
注意事项:
- 不同平台对齐规则可能不同
- 过度紧凑可能影响访问性能
- 网络传输时需考虑字节序和对齐