软件设计师 · 高频练习

两个变量的活跃区间重叠时,为什么不能分配同一个寄存器?

中级 单选题 第 1102 题 较难 软件设计师寄存器分配干涉图图着色活跃变量分析
题目

编译器为一段中间代码构造寄存器干涉图:变量a与b在某程序点同时活跃,因此图中a、b之间存在边。若用图着色进行寄存器分配,下列说法正确的是()。

A a和b不能使用同一个寄存器颜色,否则其中一个仍需保留的值会被覆盖
B 有边表示两个变量必须放在同一寄存器
C 干涉图与变量活跃性无关,只按变量名排序
D 颜色不够时可以删除程序中的变量而无需补偿
题目类型:原创高频练习题 用途:用于帮助理解软件设计师相关考点和答案解析,不等同于官方真题。
正确答案
A
答案解析

干涉边表示两个值的活跃期冲突,必须同时保留,因此不能共享同一物理寄存器。颜色数对应可用寄存器数;无法着色时通常选择部分变量Spill到内存并插入装载、存储。

选项分析

A

正确。干涉边对应不能共享同一寄存器的约束。

B

错误。边表示冲突,要求不同颜色。

C

错误。干涉图通常由控制流和活跃变量分析得到。

D

错误。寄存器不足需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到内存。