配列の宣言はスコープによって少し作法が違います。
一次元配列で違いを確かめてみましょう。
一次元配列の宣言と利用
var a; a[9]=0; // ローカル変数は先に宣言が必要 b[9]=0; // インスタンス変数はいきなり配列として確保可能 global.c[9]=0; // グローバル変数も同じくいきなり確保可能
ローカル変数の場合、先に宣言を終えて、次に配列として値を代入しないと構文エラーとなります。
var a[9]=0;
上記書き方は構文エラー。
変数として使っていたものをいきなり配列としても使えてしまうから上書きには注意。
GML では is_array 関数を使うことで変数の型が配列か否かをチェックすることができます。
動的確保
動的確保なので配列の要素数は可変です。
a[9] = 0;
上記の場合、a[0] 〜 a[9] で確保した配列なので十個の要素を持っています。一度確保した配列の要素数を上回る数で再度確保したい場合は
a[19] = 0;
このようにすれば要素数は二十個で配列はメモリ上に新しく確保されます。新しく確保した配列には、従来まで使っていた配列に溜め込んだデータも全部コピーされるため、データを維持したまま要素数の拡大ができます。
これが動的確保です。
確保した配列をメモリ上から破棄したい場合は
var a=0;
変数として同名で新しく宣言し直せば自動的に前のデータは破棄されます。
動的確保の注意点
要素数を頻繁に拡大するとパフォーマンスを落とす原因となるため、なるべく最初から必要な最大要素数で確保するよう心がけると処理速度への影響を少なくできます。
頻繁に要素数を拡大するとパフォーマンスが落ちるのは、古い配列の値を保持するためのコピー作業が伴うためです。小さな要素数ならばあまり大きな影響は出ませんが、配列は大量のデータを扱うためのデータ型なので使い方次第で要素数はいくらでも大きくなります。
配列を扱う場合
- 必要な最大要素数をきっちり把握する
- 最大要素数で最初から確保する癖を付ける
- 動的確保がなるべく発生しないよう考慮する
配列で大量のデータを扱う場合にはこれらを意識すると処理効率は上がります。
配列はメモリと関連が深く、効率的な配列の扱い方をきちんと知りたい場合は C 言語で配列とメモリ確保に関する基礎を学ぶのが良いです。