数据对齐要求数据在内存中的起始地址是数据大小的整数倍。
| 数据类型 | 大小 | 要求的起始地址 |
|---|---|---|
| char | 1 字节 | 任意地址(1 的倍数) |
| short | 2 字节 | 偶数地址(2 的倍数) |
| int | 4 字节 | 4 的倍数地址 |
| double | 8 字节 | 8 的倍数地址 |
struct {
char a; // 1 字节
int b; // 4 字节
char c; // 1 字节
};
不填充(非对齐):大小 = 6 字节,但 b 可能跨字边界。
对齐填充:
地址: 0 1 2 3 4 5 6 7 8 9 10 11 内容: [a][填充][填充][填充][b b b b][c][填充][填充][填充] 大小 = 12 字节(3 个字)
| 性质 | 说明 |
|---|---|
| 对齐地址 | 数据大小的整数倍 |
| char | 1 字节对齐(任意地址) |
| short | 2 字节对齐 |
| int / float | 4 字节对齐 |
| double | 8 字节对齐 |
| 指针 | 4 字节对齐(32 位)或 8 字节对齐(64 位) |
| 填充字节 | 为满足对齐而浪费的空间 |
| 考法 | 解题套路 |
|---|---|
| 结构体大小计算 | 按对齐规则逐个安排,总大小取整 |
| 判断地址是否对齐 | 起始地址 mod 数据大小 == 0 |
| 对齐 vs 非对齐的效率 | 对齐一次访存,非对齐可能两次 |
| 变量存放地址 | 根据对齐规则确定起始地址 |
| 填充字节计算 | 需要的对齐地址 - 当前地址 = 填充数 |
↑ 以上为站内 HTML 相对链接(纯网页可浏览);本页右上「在 Obsidian 中打开」跳回源笔记。