嵌套函数如何编译?

时间:2014-05-20 15:04:10

标签: memory compiler-construction nested-function

当我在D中有2个函数时,这样:

void func() {
    void innerFunc() {
        import std.stdio;
        writeln(x);
    }

    int x = 5;
    innerFunc();
}

当我致电func时,会打印出来.5。它是如何工作的?内存在哪里存储5? innerFunc如何知道它必须打印5?

1 个答案:

答案 0 :(得分:1)

我试图从广义上回答这个问题。这种类型的问题出现在许多允许嵌套函数定义(包括Ada和Pascal)的语言中。

通常,在处理器堆栈上分配类似“x”的变量。这是任何允许递归的语言的正常过程。

当调用嵌套函数时,封闭函数的堆栈帧的描述符将作为隐藏参数传递。

然后,

funct()知道x位于基址指针寄存器指定的某个偏移处。

innerFunct()知道x的偏移量,但必须从隐藏的参数派生出基数。它不能使用自己的基指针值,因为它与funct()不同。并且,如果innerFunct()调用自身,则每次调用时基本指针值都会不同。