グローバル変数
読み:グローバルへんすう
外語:global variable

 グローバルスコープで定義/宣言され、プログラムのどこからでも、どのスコープからでも参照/代入できる変数。大域変数。対義語はローカル変数。
目次

概要
 一般には、プロセス単位で管理されており、プロセスインスタンス内であれば、どこからでも参照することができる。
 実装にもよるが、通常はローカル変数のようにスタックではなく、ヒープなどに専用のメモリー領域を確保して配置される。
 CのほかC++でも利用できるが、C++などでは特定のクラス内にスコープを限定したメンバー変数というものが用意された。なお、Javaにはグローバル変数は存在せず、C++と同様にクラス変数が用意されている。

特徴
 同じプロセス内でのデータ交換に便利であるが、多用しすぎるとモジュール結合度が高まり、後々コードを分割して再利用することが難しくなる。
 メンテナンス性が悪化するほか、バグの元ともなるため、基本的に嫌われている。

問題点

ライフサイクル
 グローバル変数は、プロセスが起動してから終了するまで存在し続ける。
 一時的な情報交換のためにしか使わないのであれば、グローバル変数は寿命が長すぎる。

スコープ
 グローバルスコープをもつグローバル変数は、どこからでも操作できる。グローバル変数をexternすれば、他のファイルからでもアクセスできる。
 未初期化のグローバル変数にアクセスすることも可能だが、コンパイラーも判断できないため、エラーやワーニングが出ることは殆どない。
 このため、ひとたび何かの問題が生じたとき、どこで誰が用いているのかの判断が難しく、追跡するのが難しい。

変数名の衝突
 グローバル変数はどのスコープからでも参照できるので、大規模なソフトウェアにおいては、同じ名前空間の他の変数と、名前が衝突する可能性が高い。
 グローバル変数と関数内のローカル変数で名前が衝突しても基本的にはエラーにはならないが、変数の再宣言はトラブルを招き、原因究明困難なバグを引き起こしやすい。

マルチスレッド
 マルチスレッド環境でグローバル変数にアクセスする場合、複数のスレッドから同時にアクセスしてしまう可能性がある。
 特に構造体のように複数の変数にアクセスする必要がある場合は、参照と更新が同時に発生すると大問題となる。そこで同じ変数を複数のスレッドからアクセスして異常をきたさないよう、ミューテックスなどを使った排他制御が必要になり、非常に面倒になる。

再検索