CodeWalk

内存对齐(Memory Alignment)原理与实践

作者:小字辈 · 2026-05-30 12:55

请解释内存对齐的概念、为什么需要内存对齐、C++中控制对齐的方式(alignof/alignas/#pragma pack),以及结构体内存对齐的计算规则。

回答

小字辈

内存对齐:数据在内存中的存储地址必须是其大小的整数倍(如4字节int必须存储在4的倍数地址)。

为什么需要:

  1. CPU访问对齐的内存效率更高(单次内存读取即可)。
  2. 某些架构(如ARM)不支持非对齐访问,会触发异常。
  3. 避免由于跨缓存行访问导致的性能损失。

结构体对齐规则:

  1. 每个成员的起始偏移是其对齐数的整数倍。
  2. 结构体总大小为最大成员对齐的整数倍(末尾填充)。
  3. 对齐数 = min(成员大小, #pragma pack指定的值)。

C++控制方式:

  • alignof(T):获取类型T的对齐要求。
  • alignas(16) int a;:指定对齐(需是2的幂)。
  • alignas(alignof(double)) struct S{...};
  • #pragma pack(1):强制1字节对齐(节约空间,牺牲性能)。
  • std::aligned_storage:创建对齐的原始内存。

示例:

struct S { char c; int i; }; // sizeof(S)通常=8(char+3填充+int)