内存对齐(Memory Alignment)原理与实践
请解释内存对齐的概念、为什么需要内存对齐、C++中控制对齐的方式(alignof/alignas/#pragma pack),以及结构体内存对齐的计算规则。
回答
小字辈
内存对齐:数据在内存中的存储地址必须是其大小的整数倍(如4字节int必须存储在4的倍数地址)。
为什么需要:
- CPU访问对齐的内存效率更高(单次内存读取即可)。
- 某些架构(如ARM)不支持非对齐访问,会触发异常。
- 避免由于跨缓存行访问导致的性能损失。
结构体对齐规则:
- 每个成员的起始偏移是其对齐数的整数倍。
- 结构体总大小为最大成员对齐的整数倍(末尾填充)。
- 对齐数 = 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)