大域変数の実際の不都合はたくさんある。
マルチスレッド時に排他制御が必要。atomic write なら良いだろうってな話もあるが、複数の値をアクセスしたらダメ。もっとも、複数のスレッドで競合するリソースを持つ時点でダメではある。
malloc/free で、free し忘れる、あるいは、free したものにアクセスする。ありがち。
名前を汚してしまう。局所変数で隠されててアクセス出来なくなって困るとか。でも、病的に隠すのもどうかと思う。
Mac OS X みたいな PIC (位置独立コード)だと、大域変数にアクセスするには register indirect が一段入る。しかも、Dynamic loading に引っかかったりする。命令長が長くなる。一般的に、かなり遅い。volatile ついていたりすると特に。
Perl/Python/Ruby で、大域変数が遅い(my付きの場合はそうでもない)。理由は不明。
初期化が必要。最初はゼロだけど。Singleton などで、大域変数の初期化をオブジェクトで行なうと、その初期化の順序は不定となる。相互に関連するオブジェクトを大域変数の初期化に使うことは出来ない。
大域的な状態を作るなら、それを制御するプロトコルが必要。大域変数にすると、そのプロトコルを無視されてしまう。
そんなところか?
No comments:
Post a Comment