编译器为一段中间代码构造寄存器干涉图:变量a与b在某程序点同时活跃,因此图中a、b之间存在边。若用图着色进行寄存器分配,下列说法正确的是()。
干涉边表示两个值的活跃期冲突,必须同时保留,因此不能共享同一物理寄存器。颜色数对应可用寄存器数;无法着色时通常选择部分变量Spill到内存并插入装载、存储。
选项分析
正确。干涉边对应不能共享同一寄存器的约束。
错误。边表示冲突,要求不同颜色。
错误。干涉图通常由控制流和活跃变量分析得到。
错误。寄存器不足需Spill并保持程序语义,不能直接删除值。
本题为什么容易错
“图着色”容易只记成相邻点不同色,却不知道边从哪里来。理解活跃区间后,构图、着色和溢出的整条链才连得起来。
简短答案
两个变量的活跃区间重叠时,为什么不能分配同一个寄存器,正确答案是 A(a和b不能使用同一个寄存器颜色,否则其中一个仍需保留的值会被覆盖)。干涉边表示两个值的活跃期冲突,必须同时保留,因此不能共享同一物理寄存器。颜色数对应可用寄存器数;无法着色时通常选择部分变量Spill到内存并插入装载、存储。
易混淆概念对比表
| 概念 | 本题判断 | 区别要点 | 记忆提示 |
|---|---|---|---|
| a和b不能使用同一个寄存器颜色,否则其中一个仍需保留的值会被覆盖 | 本题正确答案 | 正确。干涉边对应不能共享同一寄存器的约束。 | 看到题干核心场景时优先联想到它 |
| 有边表示两个变量必须放在同一寄存器 | 本题干扰项 | 错误。边表示冲突,要求不同颜色。 | 看到该词不要急着选,先判断是否真正解决题干问题 |
| 干涉图与变量活跃性无关,只按变量名排序 | 本题干扰项 | 错误。干涉图通常由控制流和活跃变量分析得到。 | 看到该词不要急着选,先判断是否真正解决题干问题 |
| 颜色不够时可以删除程序中的变量而无需补偿 | 本题干扰项 | 错误。寄存器不足需Spill并保持程序语义,不能直接删除值。 | 看到该词不要急着选,先判断是否真正解决题干问题 |
本题易混淆选项怎么区分
- 有边表示两个变量必须放在同一寄存器:错误。边表示冲突,要求不同颜色。
- 干涉图与变量活跃性无关,只按变量名排序:错误。干涉图通常由控制流和活跃变量分析得到。
- 颜色不够时可以删除程序中的变量而无需补偿:错误。寄存器不足需Spill并保持程序语义,不能直接删除值。
知识点详解
变量从定义到最后一次可能使用之间处于活跃状态。若两个变量在某点同时活跃,它们互相干涉。K个寄存器对应K种颜色,相邻结点必须不同色;无法完成K着色时选择结点溢出到栈或内存,再改写代码。
备考速记
同时活跃就连边,连边不能同色;颜色不够,选变量落到内存。
活跃变量分析在活跃变量分析场景中的作用
编译器通常综合使用频率、循环深度和溢出成本选Spill对象,尽量保留热点变量在寄存器中,而不是只选度数最高者。
同类题怎么考
- 根据活跃区间判断变量间是否有干涉边。
- 判断寄存器不足时Spill的含义与代价。
活跃变量分析在软件设计师软考中的考法
题目出现同时活跃,直接想到不能同寄存器;出现颜色不足,选择Spill并插入访存,而不是改变程序值。
解题思路
把寄存器想成储物格。a的值还没用完时,b也要存进去,若共用一格,后写的会覆盖先前值。因此同时活跃就连边、连边就不能同色,选A。
考点定位
无边不代表一定要同寄存器,只表示具备共享可能;有边则明确不能同色。Spill会增加内存访问成本。
易错提醒
- 变量定义后就认为一直活跃到函数结束,制造过多假干涉。
- 颜色不足时随意Spill循环热点变量,性能代价很大。
- 插入Spill代码后不重新考虑新的活跃范围。
备考提示
- 先在控制流图上做live-in/live-out,再画干涉边。
- 区分合并Move指令的偏好边与真正不能同色的干涉边。
你可能还想了解
- 干涉图的边表示什么?
- 寄存器颜色不够怎么办?
- 两个变量何时可以共用寄存器?
本文小结
活跃区间重叠的变量在干涉图中相连,不能分配同一寄存器;颜色不足时需将部分变量Spill到内存。