静的ローカル変数とは、静的領域に配置されたローカル変数のことです。
例えば、あるプログラミング言語では、整数型intの静的ローカル変数aは、ローカル変数を作れるスコープにおいて、staticというキーワードを使って、以下のように宣言できます。
static int a;
ローカル変数の宣言と初期化を同時に行う場合は、以下です。
static int a = 1;
静的ローカル変数は、プログラムの開始から終了までメインメモリに存在します。
つまり、ローカル変数と違い、宣言されたスコープから抜けても静的ローカル変数用に確保されたメインメモリは開放されません。
静的ローカル変数のスコープは、ローカル変数と同じです。
静的ローカル変数は、静的領域に配置されるため、静的ローカル変数用のメインメモリの確保は、コンパイルの時点で完了しています。
よって、ソースコード上に存在する静的ローカル変数の宣言は、その位置で静的ローカル変数用のメインメモリの確保が行われる訳ではありません。
例えば、以下のようにサブルーチンtest内で宣言された静的ローカル変数aがあったとします。
void test(){
static int a;
return;
}
test();
このとき、サブルーチンtestを呼び出したときに、静的ローカル変数a用のメインメモリが確保される訳ではありません。
testを呼び出す前からすでに静的ローカル変数a用のメインメモリは、静的領域に確保されています。
よって、プログラムの実行時における静的ローカル変数の宣言は、その変数*が静的ローカル変数であることを明示する役割を担います。
静的ローカル変数の宣言と初期化を同時に行なった場合、その初期化は、一度だけ行われます。
例えば、以下のソースコードを実行すると、変数*bには2、変数*cには3、変数*dには4が代入されます。
int test(){
static int a = 1;
a = a + 1;
return a;
}
int b = test();
int c = test();
int d = test();
静的ローカル変数は、スタック領域を使わないため、スタックオーバーフローが発生しません。
よって、ローカル変数を作れるスコープで要素数の多い配列を宣言する場合は、静的ローカル変数を利用するとスタックオーバーフローを気にする必要がありません。
静的ローカル変数は、ハードウェアレベルでは、以下の仕組みで実現されています。
・静的ローカル変数の基本的な仕組みは、変数*や配列、ポインタと同じです。
・静的ローカル変数の宣言は、静的領域を確保する命令に該当します。
・静的ローカル変数の宣言と初期化を同時に行うことは、静的領域にデータを配置する命令に該当します。