プレイ日記
reji Satoshi.1103
「これで無限ループを作れるかな!?」と思ったけどこれじゃスタックオーバーフロウと出て、出来ないんだ。
4そうだね
プレイ済み
返信[1]
親投稿
ケイン KEIN.HORGAN
GOSUB や DEF は、 「(RETURN なりEND なりに到着したら、元の場所に戻らないといけないから)どこから呼び出されたか」 を覚える必要があるのです。 そして覚える為にはメモリが必要ですが、当然そのメモリは無限にあるわけではないので、ある程度以上はメモリ不足になります。
1そうだね
プレイ済み
返信[2]
親投稿
reji Satoshi.1103
ケインさんコメントありがとうございます。 なるほど!! そう言うことなのですかー♪ つまりGOSUBでも同じような現象がおこるんですね。
1そうだね
プレイ済み
返信[3]
親投稿
MIKI ifconfig
def と gosub は戻る場所を別に管理しています。 def の記憶領域は大変狭い。あまりにも狭い。 かたや gosub の方は相当いけます。けど無限でないという意味では同じ。
1そうだね
プレイ済み
返信[4]
親投稿
reji Satoshi.1103
みきさんコメントありがとうございます! 意外とDEFの方が少ないのですかー。 参考になりました。本当にありがとうございました。
0そうだね
プレイ済み
返信[5]
親投稿
ケイン KEIN.HORGAN
ちょっと興味があって試しに再帰処理のループ数をチェックしてみました。 DEF LOOP INC X:?X:LOOP END LOOP と、 @LOOP INC X:?X:GOSUB @LOOP RETURN GOSUB @LOOP です。結果は、DEF が2730、GOSUB が16383でした。DEF の値が中途半端なのが気になりますが…… GOSUB が圧勝なのは確か。 DEF の方は、ローカル変数の為に余計にメモリ食ってるのかなぁ。
0そうだね
プレイ済み
返信[6]
親投稿
ケイン KEIN.HORGAN
ん、GOSUB の方のプログラムはこれ、エラー出てないだけでミスってますね。 本当は、GOSUB @LOOP を最初の行に持っていって、そしてその次の行にEND が必要ですね。 それはそうと、DEF の方はDEF 命令内でローカル変数を定義すると再帰可能数が減りました。 DEF 用のメモリは、呼び出し位置の記憶と、ローカル変数用のメモリを共有しているっぽいですね そして…… えーと、GOSUB を10000回くらい再帰させてからDEF の再帰を呼び出すのと、16000回くらい再帰してからDEF の再帰を呼び出すと、DEF の再帰可能数が減ったので…… GOSUB と DEF って、メモリ共有してるんじゃないのかなぁ?
1そうだね
プレイ済み
返信[7]
親投稿
reji Satoshi.1103
コメントありがとうございます。 ええっ! 途中からややこしくなってきたけど、つまりGOSUBとDEFのメモリが一緒なんですか~!? 何かよくわからないけど凄そうです♪
0そうだね
プレイ済み
返信[8]
親投稿
MIKI ifconfig
先日のファンミーティングでしたっけ? 「隊長こと細田氏によるプチコン3号の解説」 http://www.itmedia.co.jp/pcuser/articles/1510/20/news137_2.html def の方はこの図のスタックの方を使ってるんだと思います。 一方 gosub はヒープの方を使って独自にスタックを実現してる、と考えています。
0そうだね
プレイ済み