コミュニティアイコン プチコン 非公式コミュニティ トピック

アバター
こういち ◆ou0jbJnEJ0Kb
2023/2/8 12:46
質問
スタックとローカル変数
このようなサブルーチンを書いてたんですが、2つほど気になることがあります。
DEF CONBOL(A[],B[],N)
 DIM AR[N],AJ[N]
 DIM BR[N],BJ[N]
 DIM R[N],J[N]
 DIM O[N]
 COPY AR,A:COPY BR,B
 FFT AR,AJ,AR,AJ:FFT BR,BJ,BR,BJ
 ARYOP 2,R,AR,BR:ARYOP 2,J,AJ,BJ:ARYOP 1,R,R,J
 ARYOP 2,J,AR,BJ:ARYOP 4,J,BR,AJ,J
 IFFT, R,J,O,AR
 RETURN O
END

@:AR,AJのようなローカルの配列はスタックを配列のサイズ分だけ消費しますか?
A:配列や文字列でない普通のローカル変数だとどうですか?
スタックじゃなくてヒープ(?)が消費されるなら厄介だな…と思ったので質問させて頂きました。

コメント

アバター
こういち 2023/2/8 22:51 ◆ou0jbJnEJ0Kb
しかし、スタックが消費されるならそれはそれで厄介ですね。(スタック上の配列はpush/popが出来ない)
Mikiさんがスタックの減る条件について何か言及してた気がするけど…
アバター
こういち 2023/2/10 23:50 ◆ou0jbJnEJ0Kb
画像のプログラムを実行して、エラーのタイミングでループ変数の中身を見て検証しました。

結果
SUB1:21845
SUB2:16383
SUB3:8191
SUB4:16383
SUB5:16384

このことから考えられるのは
・ローカル変数はスタック上に確保される
・ローカル配列はアドレスのみスタックに確保され、本体はヒープに確保される。(配列のサイズが大きいとOut of memoryになる)
・1つの変数あたりで確保されるメモリの量はおそらく型によって変わらない

これはキツい。せめてFFTがCOPYやFILLみたいに要素数指定出来たらグローバル変数でなんとか出来たのにな…
アバター
こういち 2023/2/15 16:48 ◆ou0jbJnEJ0Kb
これ、どうすればいいですか?
CONBOL2048みたいに予め要素数決め打ちしておいて、その要素数のグローバル変数作っておくとか?(サブルーチンの意味とは)

…真面目な話、定数っぽい変数Nと要素数2*Nのグローバル配列を用意しといてCONBOL2Nみたいにするとか?

SMILEBASICがもう少し断片化耐性あれば…(結構断片化が問題になるイメージある)
アバター
こういち 2023/2/16 3:26 ◆ou0jbJnEJ0Kb
あー。配列A,Bを畳み込みするのに必要なFFTの要素数って、A,Bの要素数をN,MとしたときN+M以上必要なんですよね。
つまり、グローバル変数の要素数が大きい分には何ら問題はないという(ただし、速度にはガッツリ影響する)

コメントを書く

  • こちらは「プチコン3号」「プチコンBIG」など、プチコンシリーズに関する話題を扱ったコミュニティです
  • プチコンシリーズにまったく関係ない書き込みはご遠慮下さい。削除の対象となります
  • こちらにはその他のゲームや雑談のコミュニティはなく、作る予定もありません (ひとりで管理できないため)。ごめんなさい
  • ユーザー登録なしで書き込みができます
  • 秘密の合い言葉は成りすましの防止 (トリップ機能)、書き込みの編集時の本人認証に使用します
  • 秘密の合い言葉に他人に推測されやすい言葉、他サービスと同じパスワードは入力しないでください。
  • 書き込むと、投稿時に入力したお名前と秘密の暗号が記憶され、ログイン状態になります

- WEB PATIO -