当我在 D 中有两个这样的函数时:
void func() {
void innerFunc() {
import std.stdio;
writeln(x);
}
int x = 5;
innerFunc();
}
当我调用func
这将打印 5. 它是如何工作的?5在内存中存储在哪里?innerFunc 怎么知道它必须打印 5?
当我在 D 中有两个这样的函数时:
void func() {
void innerFunc() {
import std.stdio;
writeln(x);
}
int x = 5;
innerFunc();
}
当我调用func
这将打印 5. 它是如何工作的?5在内存中存储在哪里?innerFunc 怎么知道它必须打印 5?
我试图从广义上回答这个问题。这类问题出现在许多允许嵌套函数定义的语言中(包括 Ada 和 Pascal)。
通常,像“x”这样的变量会分配在处理器堆栈上。这是任何允许递归的语言的正常过程。
当调用嵌套函数时,封闭函数堆栈帧的描述符将作为隐藏参数传递。
funct() 然后知道 x 位于基指针寄存器指定的某个偏移量处。
innerFunct () 知道 x 的偏移量,但必须从隐藏参数中导出基数。它不能使用自己的基指针值,因为它与funct() 不同。而且,如果 innerFunct () 调用自身,则每次调用的基指针值都会不同。