hinekure.net が http://hspdev-wiki.net/ から自動クローリングした結果を表示しています。画像やリソースなどのリンクが切れています。予めご了承ください。
変数領域の自動確保 - HSP開発wiki
トップ    編集凍結 差分バックアップ添付複製名前変更リロード   新規一覧単語検索最終更新   最終更新のRSS

小ワザ

hsp3.png

変数領域の自動確保

hsp3.0から変数の領域は必要とするサイズが自動確保されるようになったが全く制限なしというわけではないようなのでここでレポート。



配列変数の読み方

配列変数を作る命令はdim(数値)やsdim(文字列)などがあります。例に整数型配列変数を作るdim命令の書式を挙げると

dim 配列変数名, 1次要素数, 2次要素数, 3次要素数, 4次要素数

のようになっています。
1次元配列変数はn個の変数が連続する配列のことで、配列変数において1つ1つの変数を要素と呼びます。
2次元以上の配列変数をイメージするときは少し頭を使います。
例えば、

dim a, 2, 3

の配列変数aは「要素が2個の塊が3個連続する配列変数」と読みます。
同様に、

dim d, 2, 3, 4

の配列変数dは「要素が2個の塊が3個の塊が4個連続する配列変数」と読みます。

配列変数の要素は1次元目→2次元目→3次元目→4次元目の順番で指定します。
次の項のメモリ上のイメージを見ると分かりますが要素を指定するとき、もっとも小さい次元(区分)から指定していきます。
図を見る限り要素の位置を示す上では「4次元目→3次元目→2次元目→1次元目」のように、大区分から小区分へと向かって指定していく方が自然と言えます。
このことはあなた方の住まいが「太陽系惑星→地球→日本→関東→東京→??区→」のように大から小へと限定されていくことを想像すれば分かりますね?

HSP以外の言語(C言語から派生する言語)などはこの方法をとっており、

HSP・・・・dim a,2,3,4 
C言語・・・int a[4][3][2];

の2つはそれぞれ等価な配列変数を表します。
それぞれの指定方法には一長一短があり、HSPではメモリ上の先頭要素と表記上の先頭要素が一致する方法を採用しています。(BASICから派生)

数値型多次元配列のメモリ上のイメージ

dimarray.png

上の図は数値型(整数型・実数型)多次元配列のイメージですが文字列型配列以外の配列変数の要素はメモリに連続して割り当てられます。

自動確保とは

変数にはデータを格納する領域がメモリに確保されています。
通常の変数はデータ(要素)を1つ保持できます。

その変数が現在保持できる要素数を超えてデータを格納しようとした時、HSPは変数に必要なメモリ領域を新たに再確保します。
再確保によって以前のメモリ領域よりも大きな領域が割り当てられます。
これを変数領域の自動確保と呼びます。

自動確保が行われる例

自動確保は通常は代入時に行われます。
また命令や関数などに配列の要素として添え字をつけて指定した場合にも必要なら自動確保が行われます。

+  自動確保が行われる例

自動確保が行われない例

ただしmes(他は不明)や式などの要素の参照として使われる場合や、多次元配列において要素のオフセットが変わるような場合は自動確保が行われません。
※スクリプトの実行を進める場合はNGの列をコメントアウトしていってください。

+  自動確保が行われない例

自動確保のメカニズム

mexpand1.png
mexpand2.png

自動確保のパフォーマンス

デフォルトの変数領域は64byte確保されているので全体の要素数が整数型で16こ、実数型であれば8こ使えることになります。
これ以上の要素をメモリ上に記憶しようとするとき、領域の自動確保が発生します。
半分正解、半分勘違い。自動確保というより新しい要素を追加しようとするとき常に再割り当ては起きている。
ただし頻繁に割り当て(メモリブロックのコピーなど)が行われるため効率が悪くなる。
配列変数として使用する場合は先にdim宣言をすることにより不必要なデータのコピーをなくすことができる。

コメント

  • しょっぱなから嘘書いたっぽいです。 -- kz3 2006-02-04 (土) 13:55:39
  • 図の宣言と各データの変数名が違ってるXD -- kz3 2006-02-04 (土) 14:54:23
  • hsp2.61って領域拡大しているんだっけ?repeat 16をrepeat 17にしたらエラーが出たけど?
    2.61あまり使ってないから良く分かんないけど -- Shark++ 2006-02-04 (土) 15:23:38
  • あと、先に自動確保の制限とやらを書いたほうがよい気がする -- Shark++ 2006-02-04 (土) 15:26:33
  • hsp2.61は固定ですね。(2.xxは自動確保されないことを示したかったけど説明不足でした)制限もこのあと書きます(明日以降orz) -- kz3 2006-02-04 (土) 15:35:41
  • つまり次元をまたいで下位次元のサイズを変えてしまうと上位次元のオフセットが変わってしまい単純にメモリのコピーが出来ないためにエラーって事ですかね・・・。 -- kz3 2006-02-04 (土) 16:04:34
  • 文章で説明より図の方が分かりやすいので作ってしまいました。
    自動確保・自動拡張・再割り当てと用語を統一できなくてすみません(--; -- kz3 2006-02-04 (土) 17:25:52
  • 少し整理。 -- kz3 2006-02-05 (日) 11:55:38
  • 要するに、最高次元と、それより1つ上の次元については、自動拡張が働くってこと。 -- 2010-06-22 (火) 22:56:44

URL B I U SIZE Black Maroon Green Olive Navy Purple Teal Gray Silver Red Lime Yellow Blue Fuchsia Aqua White

トップ    編集凍結 差分バックアップ添付複製名前変更リロード   新規一覧単語検索最終更新   最終更新のRSS
Last-modified: 2010-11-04 (木) 01:04:19 (1130d)