首页/计算机组成原理/指令系统/数据对齐存放 🔗 在 Obsidian 中打开
计算机组成原理 · 指令系统

数据对齐存放

重要度 ⭐⭐⭐指令系统数据对齐边界对齐存储
速查
对齐原则:数据起始地址是其大小的整数倍。char→任意、short 2B→偶数int 4B→4 的倍数、double 8B→8 的倍数。对齐 = 空间换时间(1 次总线事务取完)。

核心概念

什么是数据对齐?

数据对齐要求数据在内存中的起始地址是数据大小的整数倍

数据类型大小要求的起始地址
char1 字节任意地址(1 的倍数)
short2 字节偶数地址(2 的倍数)
int4 字节4 的倍数地址
double8 字节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 个字)

结构体对齐规则

  1. 每个成员按自身大小对齐。
  2. 结构体总大小是最大成员大小的整数倍。
  3. 成员之间可能需要填充字节。
易错结构体总大小是最大成员的整数倍,尾部也要填充——不是只看成员之间。

关键性质

性质说明
对齐地址数据大小的整数倍
char1 字节对齐(任意地址)
short2 字节对齐
int / float4 字节对齐
double8 字节对齐
指针4 字节对齐(32 位)或 8 字节对齐(64 位)
填充字节为满足对齐而浪费的空间

常见考法

考法解题套路
结构体大小计算按对齐规则逐个安排,总大小取整
判断地址是否对齐起始地址 mod 数据大小 == 0
对齐 vs 非对齐的效率对齐一次访存,非对齐可能两次
变量存放地址根据对齐规则确定起始地址
填充字节计算需要的对齐地址 - 当前地址 = 填充数

易错点

必记
  • 对齐是按起始地址判断,不是按结束地址。
  • 结构体总大小必须是最大成员的整数倍(尾部也要填充)。
  • 对齐浪费空间但提高速度,是空间换时间
  • 不同编译器/平台的对齐规则可能不同。
  • 408 考试按标准对齐规则计算。

核心结论

  1. 数据对齐要求起始地址是数据大小的整数倍。
  2. 对齐提高访存效率(一次总线事务完成)。
  3. 非对齐可能需要两次访存,甚至硬件不支持。
  4. 结构体对齐需要考虑填充字节。
  5. 对齐是空间换时间的典型例子。

记忆卡片

数据对齐的原则?
起始地址是数据大小的整数倍。
为什么对齐能提高效率?
数据在一个字内 → 一次访存完成。
int 类型要求什么对齐?
4 字节对齐:起始地址是 4 的倍数。
非对齐访问的问题?
需两次访存(数据跨字边界);结构体总大小必须是最大成员大小的整数倍。

交互动画 · 对齐 vs 非对齐访存

struct { char a; int b; char c; } 字0 字1 字2 橙 = int b 绿 = char a 棕 = char c 灰 = 填充
点击「对齐 / 非对齐」,观察 int b 是否跨越字边界
提示:高亮字边界可看清 b 落在几个字内

相关知识点

big-endian-little-endian instruction-format

↑ 以上为站内 HTML 相对链接(纯网页可浏览);本页右上「在 Obsidian 中打开」跳回源笔记。