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