1

次のように D に 2 つの関数がある場合:

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 に答える