前置知识: C

内存对齐

2 minAdvanced2026/6/14

C语言内存对齐详解:struct大小计算、#pragma pack与对齐规则。

1. 对齐规则

1.1 基本规则

  1. 成员对齐:每个成员的偏移量必须是 min(成员大小, 默认对齐数) 的整数倍
  2. 结构体对齐:结构体总大小必须是最大成员对齐数的整数倍
  3. 默认对齐数:VS 为 8,GCC 无默认值(按成员大小对齐)

1.2 示例

struct A {
    char a;    // 1 字节,偏移 0
    int b;     // 4 字节,偏移 4(填充 3 字节)
    short c;   // 2 字节,偏移 8
};
// sizeof = 12(填充到 4 的倍数)
struct B {
    int b;     // 4 字节,偏移 0
    short c;   // 2 字节,偏移 4
    char a;    // 1 字节,偏移 6
};
// sizeof = 8(更紧凑)

2. #pragma pack

#pragma pack(push, 1)  // 1 字节对齐
struct Packed {
    char a;    // 偏移 0
    int b;     // 偏移 1
    short c;   // 偏移 5
};
#pragma pack(pop)
// sizeof = 7

3. 对齐计算公式

offset=current offsetalignment×alignment\text{offset} = \lceil \frac{\text{current offset}}{\text{alignment}} \rceil \times \text{alignment}

struct size=last member endmax alignment×max alignment\text{struct size} = \lceil \frac{\text{last member end}}{\text{max alignment}} \rceil \times \text{max alignment}

4. 为什么要对齐

  • CPU 访问对齐的内存更快(单次总线传输)
  • 某些架构访问未对齐内存会触发异常
  • 空间换时间的权衡