次のように D に 2 つの関数がある場合:
void func() {
void innerFunc() {
import std.stdio;
writeln(x);
}
int x = 5;
innerFunc();
}
これを呼び出すとfunc
、5 が出力されます。5 はメモリのどこに格納されますか? innerFunc は 5 を出力する必要があることをどのように認識していますか?
次のように D に 2 つの関数がある場合:
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 () がそれ自体を呼び出した場合、ベース ポインターの値は呼び出しごとに異なります。