1. 数组与指针运算 (Array Arithmetic)
数组在机器级只是连续的字节序列。C 语言的指针运算实际上是地址计算。
- 公式: 对于
T A[N],元素A[i]的地址为: - 二维数组: 对于
T D[R][C],元素D[i][j]的地址为: - 工程意义: 汇编器会将乘法优化为移位和 LEA 指令(如我们之前分析的步长
4*(N+1))。
2. 结构体与对齐 (Structs & Alignment)
对齐原则: 任何 K 字节的基本对象,其地址必须是 K 的倍数。
- 目的: 硬件效率。内存子系统读取对齐数据比非对齐数据快得多(甚至某些 CPU 不支持非对齐读取)。
- 填充 (Padding): 编译器会在字段之间插入“废料”以满足对齐要求。
- 安全视角: 这些 Padding 区域有时可能藏匿脏数据或被利用。
3. 结构体末尾对齐
结构体的总大小必须是其最大字段对齐要求的倍数。这导致结构体末尾也可能存在 Padding(尤其是数组场景)。