単純変数の
有効期間 は、その
範囲(Scope)に対する静的メモリ割り当ての宣言キーワードから作成されます。
序文:
- 変数の有効期間は、変数が有効なメモリに存在する期間です(範囲は、参照する、変数の名前が表示されているプログラムの部分)。
変数の値は、その有効期間中に変更される場合がありますが、一定の値を保持します。
- 考慮される単純変数は、生のポインター、固定長の文字列/配列を含む事前定義された変数です。可変長の文字列/配列は含まれません。
単純な UDT(動的データが割り当てられていない)のインスタンスも対象になります。
- 静的メモリを割り当てる宣言キーワードは、'Dim', 'Static', 'Var' です。
上記のように静的に割り当てられた変数は、有効期間は通常周囲のスコープと一致します。しかし、そうでない場合は、これより長くなる可能性があります。
周囲の範囲に一致する有効期間を宣言する構文
どこでも、次のように(または同様の構文で)宣言された変数の場合:
又は
(2) Var Shared variablename = expression
(equivalent to: 'Dim Shared As Typeof((expression)) = expression')
又は
これらの変数は、常にその周囲の範囲(グローバル範囲、または範囲ブロック、または複合命令文ブロック、または手続き範囲)に対応する有効期間があります。
(1) または
(2) の構文では、ローカル変数は、常にその宣言時にプログラムのスタック上に割り当てられ、その範囲を外る時に自動的に解放されます。
(3)、
(4)、
(5) の構文では、グローバル変数は、常に実行可能ファイルの .BSS または .DATA セクションで割り当てられます(その範囲と有効期間は、プログラムの作成で始まり、プログラムの終了で終わります)。
周囲の範囲よりも存続期間が大きい可能性がある宣言構文
どこでも、次のように(または同様の構文で)宣言された変数の場合:
この変数の存続期間は、常にプログラムの期間に等しいため、ローカル範囲ブロックで宣言されている場合でも、周囲のスコープより長くなります(グローバル範囲で宣言されている場合は、周囲の範囲と一致します)。
静的変数は、常に実行可能ファイルの .BSS または .DATA セクションで割り当てられます(その有効期間はプログラムの作成で始まり、プログラムの終了で終わります)。
複合命令ブロックまたは手続き範囲でこのような静的変数を宣言する意義:
-「Dim」の場合、「Static」キーワードは、複合命令文ブロックまたは手続き範囲で使われ、複合命令文ブロックまたは手続きの最後で範囲が停止する変数を宣言します。
- ただし、「Dim」と異なり、「Static」キーワードで宣言された変数は、複合命令ブロックの連続ループまたは手続きの連続呼び出しの間で値を保持するため、有効期間は異なります。
- 要約すると、宣言された静的変数はローカル範囲を持ちますが、その有効期間はグローバル範囲変数の有効期間と同じです。
- そのため、同じ名前の静的変数は、複数の異なる複合命令文ブロックおよび異なる手続き範囲で宣言できます。
そして、これらの各変数は独立したままで、独自のローカル範囲で独自の値を保持します。
例
ローカル範囲で宣言されたさまざまな変数間の有効期間の比較:
手続き範囲で宣言されたローカル変数と静的変数
Dim Shared As ZString Ptr pzl ' global variable to memorize the local Zstring address
Dim Shared As ZString Ptr pzs ' global variable to memorize the static Zstring address
Declare Sub prntSubString (ByVal p As ZString Ptr, ByVal size As Integer)
Sub s () ' beginning of procedure scope
Dim As ZString * 15 zl = "local variable" ' declare/initialize a local Zstring
pzl = @zl ' memorize the local Zstring address
Static As ZString * 16 zs = "static variable" ' declare/initialize a static Zstring
pzs = @zs ' memorize the static Zstring address
Print " From inside the procedure scope:"
prntSubString(pzl, 14) ' display address/content of the local zstring
prntSubString(pzs, 15) ' display address/content of the static zstring
End Sub ' end of procedure scope
Print "Lifetimes comparison between local/static variables declared in a local scope:"
s() ' call the procedure
Print " From outside the procedure scope:"
prntSubString(pzl, 14) ' display address/content of the local zstring after going out its scope
prntSubString(pzs, 15) ' display address/content of the static zstring after going out its scope
Sleep
Sub prntSubString (ByVal p As ZString Ptr, ByVal size As Integer)
Print , "&h" & Hex(p, SizeOf(Any Ptr) * 2),
Print """";
For I As Integer = 0 To size - 1
Dim As UByte u = (*p)[I]
If u < Asc(" ") Then
Print " ";
Else
Print Chr(u);
End If
Next I
Print """"
End Sub
出力例:
Lifetimes comparison between local/static variables declared in a local scope:
From inside the procedure scope:
&h0019FE74 "local variable"
&h00407004 "static variable"
From outside the procedure scope:
&h0019FE74 " p@ Cp@ ?�� Y "
&h00407004 "static variable"
参照