グローバル変数
読み:グローバルへんすう
外語:global variable
グローバルスコープ
で定義/宣言され、
プログラム
のどこからでも、どの
スコープ
からでも参照/代入できる変数。大域変数。対義語はローカル変数。
目次
概要
特徴
問題点
ライフサイクル
スコープ
変数名の衝突
マルチスレッド
概要
一般には、
プロセス
単位で管理されており、プロセスインスタンス内であれば、どこからでも参照することができる。
実装にもよるが、通常はローカル変数のようにスタックではなく、
ヒープ
などに専用のメモリー領域を確保して配置される。
C
のほか
C++
でも利用できるが、C++などでは特定のクラス内にスコープを限定した
メンバー変数
というものが用意された。なお、
Java
にはグローバル変数は存在せず、C++と同様にクラス変数が用意されている。
特徴
同じプロセス内でのデータ交換に便利であるが、多用しすぎるとモジュール結合度が高まり、後々コードを分割して再利用することが難しくなる。
メンテナンス性が悪化するほか、
バグ
の元ともなるため、基本的に嫌われている。
問題点
ライフサイクル
グローバル変数は、プロセスが起動してから終了するまで存在し続ける。
一時的な情報交換のためにしか使わないのであれば、グローバル変数は寿命が長すぎる。
スコープ
グローバルスコープ
をもつグローバル変数は、どこからでも操作できる。グローバル変数を
extern
すれば、他のファイルからでもアクセスできる。
未初期化のグローバル変数にアクセスすることも可能だが、
コンパイラー
も判断できないため、エラーやワーニングが出ることは殆どない。
このため、ひとたび何かの問題が生じたとき、どこで誰が用いているのかの判断が難しく、追跡するのが難しい。
変数名の衝突
グローバル変数はどの
スコープ
からでも参照できるので、大規模なソフトウェアにおいては、同じ名前空間の他の変数と、名前が衝突する可能性が高い。
グローバル変数と関数内のローカル変数で名前が衝突しても基本的にはエラーにはならないが、変数の
再宣言
はトラブルを招き、原因究明困難なバグを引き起こしやすい。
マルチスレッド
マルチスレッド環境でグローバル変数にアクセスする場合、複数のスレッドから同時にアクセスしてしまう可能性がある。
特に構造体のように複数の変数にアクセスする必要がある場合は、参照と更新が同時に発生すると大問題となる。そこで同じ変数を複数のスレッドからアクセスして異常をきたさないよう、
ミューテックス
などを使った
排他制御
が必要になり、非常に面倒になる。
再検索