静的ローカル変数

静的ローカル変数とは、静的領域に配置されたローカル変数のことです。

例えば、あるプログラミング言語では、整数型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();

静的ローカル変数と要素数の多い配列

静的ローカル変数は、スタック領域を使わないため、スタックオーバーフローが発生しません。

よって、ローカル変数を作れるスコープで要素数の多い配列を宣言する場合は、静的ローカル変数を利用するとスタックオーバーフローを気にする必要がありません。

静的ローカル変数の仕組み(ハードウェアレベル)

静的ローカル変数は、ハードウェアレベルでは、以下の仕組みで実現されています。

・静的ローカル変数の基本的な仕組みは、変数*や配列、ポインタと同じです。

・静的ローカル変数の宣言は、静的領域を確保する命令に該当します。

・静的ローカル変数の宣言と初期化を同時に行うことは、静的領域にデータを配置する命令に該当します。