> 技术文档 > c语言结构体字节对齐

c语言结构体字节对齐

在 C 语言中,结构字节对齐(Structure Padding or Alignment)是一种为了提高访问效率而自动插入的空字节(padding bytes)机制。以下是详细解释:


🔧 为什么需要字节对齐

现代处理器通常对特定的数据类型有对齐要求,比如:

  • int 通常需要按 4 字节对齐;

  • short 通常需要按 2 字节对齐;

  • char 通常对齐要求最低(1 字节);

未对齐访问可能会带来性能下降,甚至在某些架构(如 ARM)中直接报错。


📐 对齐规则

结构体成员的地址应满足其类型的对齐要求。C 编译器通常遵循以下规则:

  1. 结构体每个成员的地址必须是其类型对齐大小的倍数。

  2. 结构体的总大小是其最大对齐单位的倍数。

  3. 必要时在成员之间或末尾填充空字节。


🧪 示例讲解

#include struct A { char a; // 1字节 int b; // 4字节 short c; // 2字节};

计算大小:

  • char a 占 1 字节;

  • int b 需要从 4 字节对齐位置开始,因此填充 3 字节(padding);

  • int b 占 4 字节;

  • short c 需要 2 字节对齐,没问题;

  • 结构体最大对齐单位是 4(因为 int),所以最后再填充 2 字节使总长度是 4 的倍数。

🔹 最终大小:12 字节


📦 结构体对齐控制方式

1. 使用 #pragma pack(n)

#pragma pack(1) // 取消对齐,所有成员按 1 字节对齐struct A { char a; int b; short c;};#pragma pack() // 恢复默认对齐

🔸 此时结构体大小为 7 字节(无填充)。

2. 使用 __attribute__((packed)) (GCC)

struct __attribute__((packed)) A { char a; int b; short c;};

效果同 #pragma pack(1),所有成员紧凑排列。


📊 如何查看结构体大小

可以使用 sizeof 运算符:

printf(\"sizeof(struct A) = %lu\\n\", sizeof(struct A));

✅ 小结

对齐方式 优点 缺点 默认对齐(性能优先) 访问速度快 空间浪费(有填充) 取消对齐(空间优先) 节省空间 访问慢,或可能非法访问

根据具体场景(性能 vs 空间)选择是否开启对齐控制。

如需示例测试代码或可视化内存布局,我可以为你补充。