1

当我在 D 中有两个这样的函数时:

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

    int x = 5;
    innerFunc();
}

当我调用func这将打印 5. 它是如何工作的?5在内存中存储在哪里?innerFunc 怎么知道它必须打印 5?

4

1 回答 1

2

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

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

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

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

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

于 2014-05-20T22:23:40.523 回答