[1741] Re:ローカル変数のアドレスをスタックにpushしている?
投稿者:とも
2011/09/11 11:34:04
早速のお返事ありがとうございます。
なるほど、crowbarスタックの構造を勘違いしてました。
Stack構造体のstackメンバがCRB_Value*型だということは、"CRB_Value*"の集合ではなく、"CRB_Value"そのものの集合だということですね。
自分で作成中のものが、スタックを"アドレスの集合"にしているので、それと同じだと思い込んでいました。
参考になりました。
これからも、「プログラミング言語を作る」を参考にオリジナル言語の作成を続けたいと思います。
>こんにちは。ご意見ありがとうございます。
>
>>「プログラミング言語を作る」を大いに参考にさせて頂いています。
>>というより、かなりまねをさせてもらってます。
>
>そういっていただけると私も嬉しいです。
>
>>関数の初頭で、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程度のサイズの型なら値渡しにするという
>選択肢は十分考えられると思うのですけれども。