[1740] Re:ローカル変数のアドレスをスタックにpushしている?
投稿者:(ぱ)こと管理人
2011/09/11 03:00:48
こんにちは。ご意見ありがとうございます。
>「プログラミング言語を作る」を大いに参考にさせて頂いています。
>というより、かなりまねをさせてもらってます。
そういっていただけると私も嬉しいです。
>関数の初頭で、resultというCRB_Value型の変数を宣言していますね。
>式の評価結果をそれに詰め、最終的にcrowbarスタックにそのアドレスをpushしていると思います。
>しかし、resultはローカル変数なので、関数を抜けるとその領域は既に使えないのではないか?という心配です。
・resultはローカル変数なので、関数を抜けるとその領域は使えません。
・最終的にcrowbarスタックにresultをpush()する際は、以下のような処理を
行っています。
push_value(inter, &result);
・resultのポインタをpush_value()に渡したって、resultの領域は
すぐに開放されてしまうのだから役に立たないのではないか? というのが
ご懸念されていることだと思います。
しかし、push_value()の中では、最終的には以下のようにして値をcrowbarスタックに
格納しています。
static void
push_value(CRB_Interpreter *inter, CRB_Value *value)
{
(中略)
inter->stack.stack[inter->stack.stack_pointer] = *value;
渡されたCRB_Valueは確かにポインタですが、*演算子により
「ポインタの指す先の値」をコピーしてスタックに格納していますので、
この後でresultが開放されても問題ありません。
なお、push_value()の引数として、CRB_Value*ではなくCRB_Valueを受け取るように
することはもちろん可能です。
現状の実装でなぜポインタを渡しているのかというと…… 構造体は大きいかも
しれないので値渡しをすると効率上の問題が出るかも、という懸念があったのかと
思います。実際問題としては、CRB_Value程度のサイズの型なら値渡しにするという
選択肢は十分考えられると思うのですけれども。