C++
 Computer >> コンピューター >  >> プログラミング >> C++

C++の静的変数(static変数)の有効期間は?プログラム終了まで生存する仕組みを解説

静的変数(static変数)とは

静的変数とは、static キーワードを使って宣言された変数のことです。静的変数に必要なメモリ領域は一度だけ割り当てられ、その領域はプログラム全体を通して使い続けられます。

通常のローカル変数は、関数が呼び出されるたびに新しく生成され、関数が終了すると破棄されます。一方、静的変数は一度宣言されると、プログラムが実行されている間ずっと存在し続けるという点が大きく異なります。

静的変数の有効期間

静的変数の有効期間は、プログラムの有効期間と同じです。つまり、プログラムの開始から終了まで、値が保持され続けます。

また、C++の静的変数には以下のような特徴があります。

  • 初期化はプログラムの実行中に一度だけ行われる
  • 明示的に初期化しない場合、自動的にゼロで初期化される
  • スコープ(可視範囲)はローカル変数と同じだが、関数呼び出しの間も値が保持される

サンプルプログラム

静的変数の動作を確認できるサンプルプログラムは以下の通りです。

#include <iostream>
using namespace std;

void func() {
    static int num = 1;
    cout << "Value of num: " << num << "\n";
    num++;
}

int main() {
    func();
    func();
    func();
    return 0;
}

出力結果

上記プログラムを実行すると、次のような出力が得られます。

Value of num: 1
Value of num: 2
Value of num: 3

プログラムの解説

func() 関数内の処理

func() 関数の中では、num が静的変数として宣言されており、最初の呼び出し時に一度だけ 1 で初期化されます。その後、num の現在の値を出力し、値を1増やしています。該当するコード部分は以下の通りです。

void func() {
    static int num = 1;
    cout << "Value of num: " << num << "\n";
    num++;
}

もし num が通常のローカル変数であれば、関数が呼ばれるたびに毎回 1 に初期化されてしまうため、出力はすべて「1」になります。しかし、static を付けることで、前回の呼び出し時の値が保持されるのです。

main() 関数内の処理

main() 関数では、func() を3回呼び出しています。num のためのメモリ領域は一度だけ確保され、関数を呼び出すたびに再確保されることはありません。そのため、2回目以降の呼び出しでは、前回インクリメントされた値がそのまま引き継がれ、「1」「2」「3」という結果になるわけです。

まとめ

C++における静的変数の有効期間は、宣言された瞬間からプログラムが終了するまで続きます。メモリは一度だけ割り当てられ、関数呼び出しの間も値が保持されるため、呼び出し回数のカウントやキャッシュなど、状態を維持したい処理に活用できます。ただし、プログラム全体で値が共有される性質上、多用すると意図しない副作用につながることもあるため、設計の際には注意が必要です。

  1. Windowsで使えるC++開発向けおすすめIDE 7選

    ```html 大規模なプロジェクトをプレーンなテキストエディターだけで管理するのは困難です。こうしたケースではIDE(統合開発環境)を使った方が、生産性が向上しストレスも大幅に軽減されます。IDEにはさまざまな種類があり、自分のニーズに合ったものを選ぶことが重要です。ここでは、Windowsで利用できる優れたC/C++向けIDEをご紹介します。 1. Visual Studio Microsoftが開発した定番IDEです。Windows上でのC++プログラムの構築・開発・プロファイリングにおいて、最高クラスのツール群を備えています。豊富なプラグインストアも魅力で、Azure、PowerShe

  2. C++のvolatileキーワードとは?意味と役割をわかりやすく解説

    volatileキーワードの基本的な意味C++におけるvolatileキーワードは、主に次の2つの重要な意味を持ちます。1. 変数の値は予告なく変化しうる(読み取り側の保証)volatile修飾された変数の値は、プログラマーが書いたコードによって変更されていなくても、いつでも変化する可能性があります。ハードウェアレジスタ、割り込み処理、別スレッドなどによって値が書き換えられるケースがこれに該当します。そのため、コンパイラはvolatile変数の値を読み取る際に、「前回読み取った値と同じはずだ」「直前に格納した値のままだ」といった仮定を行うことができません。必ずその都度、実際にメモリから値を再読