乐闻世界logo
搜索文章和话题

C语言中结构体对齐和内存填充是如何工作的?

2月18日 17:22

C语言中结构体对齐和内存填充是如何工作的?

内存对齐原理:

  1. 对齐规则

    • 结构体成员按照其自然边界对齐
    • char: 1字节对齐
    • short: 2字节对齐
    • int: 4字节对齐
    • double: 8字节对齐(64位系统)
  2. 结构体总大小

    • 必须是其最大成员大小的整数倍
    • 末尾可能需要填充字节

示例分析:

c
struct 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字节

优化技巧:

  1. 成员排序优化

    • 按大小降序排列成员
    • 减少填充字节浪费
  2. 使用编译器指令

    c
    #pragma pack(1) // 1字节对齐 struct Packed { char c; int i; }; #pragma pack() // 恢复默认对齐
  3. 位域使用

    c
    struct BitField { unsigned int a : 3; // 3位 unsigned int b : 5; // 5位 };

注意事项:

  • 不同平台对齐规则可能不同
  • 过度紧凑可能影响访问性能
  • 网络传输时需考虑字节序和对齐
标签:C语言