![ArrayResize](https://celebpanda.com/wp/wp-content/uploads/2021/05/ArrayResize.jpg)
配列の最初の次元のサイズを変更します。
ArrayResize
int ArrayResize(
void& array[], // 変更する配列(参照渡し)
int new_size, // 新しい配列サイズ
int reserve_size = 0 // 予備サイズ(過剰)
);
- 引数
引数名 | 初期値 | I/O | 詳細 |
array[] | - | IN OUT | サイズ変更する配列 |
new_size | - | IN | 最初の次元の新しいサイズ |
reserve_size | 0 | IN | オプションパラメータ。 予備の物理メモリを取得します。 |
- 戻り値
正常に実行された場合は、サイズ変更された配列に含まれる全要素数を返します。
それ以外は-1を返し、配列サイズは変更されていません。
- その他
この関数は動的配列に適用する事が出来ます。
SetIndexBuffer()関数によってインジケータバッファの様に割り当てられた動的配列のサイズは、変更する事が出来ません。
インジケータバッファは、ターミナルのランタイムサブシステムによってサイズ変更の処理が実行されます。
配列内の要素の合計は2147483647を超える事は出来ません。
メモリ割り当てを頻繁に行う場合、物理的なメモリ割り当ての数を減らす為、reserve_size(三番目の引数)を使用する事をお勧めします。
ArrayResize()関数の呼び出した後は、メモリの物理的な再配置は行われません。
しかし、予備メモリ内で最初の次元配列のサイズ変更だけは行えます。
これは3番目の引数が、物理メモリの割り当てにのみ使用される事を忘れてはいけません。
例えば
ArrayResize(arr,1000,1000);
for(int i=1; i<3000 ;i++) {
ArrayResize(arr,i,1000);
}
上記例では、メモリは2回割り当てられる事になります。
最初の割り当ては、ループ処理に入る前に行われます(配列サイズ:1000)。
2回目の割り当てはループ処理のiが2000になった時に行われます。
最終的に2回だけメモリ割り当てが行われます。
3番目の引数を省略して予備の物理メモリ割り当てを行っていなかった場合、
物理メモリの再配置を2000回(iが1000~2999の時)行う為、プログラムが遅くなります。