下面的程序使用了六个临时变量 a、b、c、d、e、f。
a = 1
b = 10
c = 20
d = a+b
e = c+d
f = c+e
b = c+e
e = b+f
d = 5+e
return d+f
假设所有操作都从寄存器中获取操作数,那么在不溢出的情况下执行该程序所需的最少寄存器数量是多少?
(一) 2
(乙) 3
(三) 4
(四) 6答案:(乙)
说明:所有给定的表达式最多使用 3 个变量,因此我们永远不会需要超过 3 个寄存器。
请参阅 http://en.wikipedia.org/wiki/Register_allocation
它至少需要 3 个寄存器。
寄存器分配原则:如果变量需要分配给寄存器,系统会检查是否有可用的空闲寄存器,如果找到,则进行分配。如果没有空闲寄存器,则它会检查包含死变量(其值将来不会使用的变量)的寄存器,如果找到,则分配。否则它会进行溢出(它会检查最长时间后需要其值的寄存器,将其值保存到内存中,然后将该寄存器用于当前分配,稍后当需要该寄存器的旧值时,系统获取它从保存它的内存中提取并将其分配到任何可用的寄存器中)。
但是在这里我们不应该按照问题中的指示应用溢出。
让我们为变量分配寄存器。
a = 1 (假设寄存器 R1 分配给变量 ‘a’ )
b = 10 (’b’ 的 R2,因为 ‘a’ 的值将在未来使用,因此不能用 R1 中的 ‘b’ 的变量替换 ‘a’ 的变量)
c = 20 ( R3 for ‘c’, 因为’a’ 和 ‘b’ 的值将在以后使用,因此不能分别在 R1 或 R2 中用 ‘c’ 替换变量 ‘a’ 或 ‘b’ )
d = a+b (现在,’d’ 可以分配给 R1,因为 R1 包含死变量,即 ‘a’,之所以这样称呼是因为将来不会使用它,即没有后续表达式使用变量’a’)
e = c+d (’e’ 可以分配给 R1,因为当前 R1 包含变量 ‘d’ 的值,该值不会在后续表达式中使用。)
注意:已经计算出的变量值仅用于 READ 操作(而不是 WRITE),因此我们只需要在后续表达式的 RHS 端查看变量是否将被使用。
f = c+e (’ f ‘ 可以分配给 R2,因为寄存器 R2 中的 ‘b’ 值不会在后续表达式中使用,因此 R2 可用于为 ‘ f ‘ 替换 ‘b’ 进行分配)
b = c+e ( ‘ b ‘ 可以赋值给 R3,因为 R3 中的 ‘c’ 值在以后不会被使用)
e = b+f (这里’e’已经在R1中了,所以这里没有分配,直接赋值)
d = 5+e (’d’ 可以分配给 R1 或 R3,因为两者中的值不再使用,让我们在 R1 中分配)
return d+f (这里没有分配,只是将寄存器 R1 和 R2 的内容相加并返回)
因此我们只需要 3 个寄存器,R1、R2 和 R3。
这个问题的测验