A)呼叫者保存寄存器 B)呼叫保存寄存器 C)假设编译器可以从这个过程中的某个点确定一个变量不再被使用(活性)。为了最大限度地提高编译代码的速度,在调用者保存寄存器和被调用者保存寄存器之间,编译器应该在哪里保存寄存器变量a、b和c ?证明你的答案。 (提示)函数"fn2(b)"可以递归地多次调用自己。如果"b"是在被调用者保存寄存器中分配的,那么每当"fn2(b)"被调用时,它将被保存并恢复,即使它可能不会在"fn2(b)*中使用
时间: 2024-02-25 22:58:45 浏览: 66
根据调用者保存寄存器和被调用者保存寄存器的定义,我们可以得知:
- 调用者保存寄存器是指在调用函数之前,调用者将需要用到的寄存器的值保存起来,以便在函数调用之后回复这些寄存器的值。
- 被调用者保存寄存器是指在函数中使用的寄存器的值需要被保存,以便在函数返回时恢复这些寄存器的值。
因此,在这个问题中,如果编译器可以确定变量a、b和c在某个点不再被使用,那么编译器应该选择调用者保存寄存器来保存这些寄存器变量。这是因为如果使用被调用者保存寄存器,当函数fn2(b)被递归调用时,寄存器b的值将被保存和恢复,即使它可能不会在fn2(b)中使用。这将导致额外的开销和性能损失。
为了证明这个答案,我们可以考虑以下伪代码:
```
fn1() {
// 在调用之前保存调用者保存寄存器
save_registers();
// 使用寄存器a、b和c
a = ...
b = ...
c = ...
// 当变量a、b和c不再使用时,可以选择调用者保存寄存器
// 来保存这些寄存器变量
// 因为函数fn2(b)可能会递归多次调用自己,如果使用被调用者保存寄存器,
// 寄存器b的值将被保存和恢复,即使它可能不会在fn2(b)中使用
fn2(b);
// 在返回之前恢复调用者保存寄存器
restore_registers();
}
fn2(b) {
// 在调用之前保存被调用者保存寄存器
save_registers();
// 使用寄存器b
...
// 在返回之前恢复被调用者保存寄存器
restore_registers();
}
```
如果我们使用调用者保存寄存器来保存寄存器变量a、b和c,那么在函数fn2(b)被调用时,只有调用者保存寄存器被保存和恢复。这将导致更少的开销和更好的性能。
因此,在这个问题中,编译器应该在调用者保存寄存器和被调用者保存寄存器之间选择调用者保存寄存器来保存寄存器变量a、b和c。
阅读全文