VarSetCapacity()
実行制御 | GUI表示 | 演算・変数 | メモリ・DLL操作 | 文字列操作 |
キーボード | マウス | シェル | ウィンドウ | ウィンドウグループ
ステータスバー | コントロール | サウンド | ファイル | INIファイル |
レジストリ | 環境変数 | AutoHotkey | その他 | 設定関係 | オブジェクト
VarSetCapacity()[編集]
変数に確保されているメモリのサイズを変更する。
VarSetCapacity(Var [, RequestedCapacity, FillByte])
Parameters[編集]
引数名 | 説明 | |
---|---|---|
Var | サイズの変更を行う変数。 | |
RequestedCapacity | 省略時 | 変数に何の変更も加えられず、現在確保されている容量を返す。 |
1以上の整数 | (RequestedCapacity+1)バイト分のメモリ領域を確保する。1バイトはヌル終端の分である。 | |
-1 | 変数に格納された文字列を数え直す。データは変更されない。 詳細はRemarksを参照。 | |
0 | 確保された領域を開放する。 詳細はRemarksを参照。 | |
FillByte | 確保したバッファを任意のバイト値で埋めたい場合に、その値(0...255)を指定する。 バッファを文字列としてではなくバイト列として使いたいときに利用する。 |
返り値[編集]
実際に確保された領域のサイズ。
終端のnull文字の分は含まれない。
RequestedCapacityで指定したサイズと同じか、それより小さくなる。
何らかの問題があって確保が行われなかった場合、0が返る。
RequestedCapacity引数を省略した場合、Varで指定した変数に現在確保されているメモリ領域のサイズが返る。
Remarks[編集]
空きメモリが不足していて領域の再確保ができないなどの場合、エラーダイアログが表示され、現在のスレッドが強制終了する。
AutoHotkeyのコマンドや関数などを実行する場合、変数のサイズは必要に応じて自動的に伸張される。
この場合、頻繁なサイズの変化によって再確保が多発してパフォーマンスが低下するのを防ぐため、内容のサイズよりも少し大きい領域を確保する。
内容のサイズが64バイト未満の場合、0,1,6,63バイトが確保される。
確保されているサイズが4096バイト以上の場合、 Var=
などとして変数の内容を空にすると、領域を開放して0バイトになる。
それ未満の場合や、変数の内容が空にならない場合は、確保された領域はずっとそのままになる。
4096バイト未満の変数でも、 VarSetCapacity(Var,0)
とすることで領域を解放することができる。
ただし、64バイト未満の領域は開放されない。
どうしても開放したい場合は、一旦 VarSetCapacity(Var,64)
などとしてから開放する。
変数の内容のサイズと確保されている領域のサイズは、ListVarsコマンドなどで表示される変数の一覧で見られる。
RequestedCapacityに -1
を指定すると、内部で保持されているサイズを数え直す。
これは、DllCallで UInt,&var
のように変数のアドレスを渡し、DLLの関数内で変数の内容が書き換えられたときなどに利用される。
以下の例では、3行目が有るときと無いときで変数の文字数として表示される値が変わる。 Str,var
のように文字列としてアドレスを渡した場合には、自動的に文字数は数え直される。
VarSetCapacity(var,256) DllCall("msvcrt.dll\_mbscpy", "UInt", &var, "Str","aaa", "Str") VarSetCapacity(var,-1) ListVars MsgBox
主に、DllCall()で一定のメモリを確保して渡す必要がある場合や、バッファの確保されているサイズを引数として渡す必要がある場合に使用する。
また、細かな文字列の連結を繰り返す場合などに、あらかじめ大きな領域を確保しておくことで、再確保の発生を減らしてパフォーマンスを向上させることもできる。
#MaxMem は変数のメモリ領域の自動拡張を制限するものだが、手動で領域を確保する VerSetCapacity ではこの制限は影響しない。
Related[編集]
AHKL obj.SetCapacity()
Example(s)[編集]
VarSetCapacity(MyVar, 1000) Loop { ... MyVar = %MyVar%%StringToConcatenate% ... }