ほぼメインマシンになってしまったセカンドPCにはWindows Vista32bitをインストールしている。メモリは3GB搭載しているが、リソースメータで見ても、常に2GBほどしか使われない。負荷をかけても同じだし、スワップが発生してもそれ以上メモリは使われない。
ググッてみると、いろんな情報にひっかかって、32bit OSだと、2の32乗で4GBが上限だけれども、それはグラフィックボードのメモリなどをすべて含んだ上でのアドレッシングだから4GBは使えないという情報だったり、アプリケーションは2GBまでの領域しか使えないという情報だったり。
でも、自分のプログラマという立場でこの問題を考えるとあっさりと理解できることになった。
ポインタを符号付きにするか、しないか、ただそれだけではないか?ということである。
符号無しポインタ、つまり、ポインタ変数をunsignedという前提で考えれば、32bit環境であれば2の32乗をフラットにアクセスできる。つまり、4GBのメモリ空間を自由に使うことができる。その構成はアプリケーションは理解する必要はない。OSが管理する方法なので、普通のメモリ(RAMとしてマザーボードに搭載した分)だろうが、グラフィックボードのメモリだろうが、スワップだろうが、OSが提供してくれたものにアクセスするだけだろう。
ただ、符号付きポインタ、signedのポインタ変数でアクセスする、というか普通にポインタ変数を宣言すればこちらになるのが普通だと思っているのだけれども、これだと符号で1bit取られるから、32bit環境なら、実質31bit分しかアクセス出来ないことになるだろう。
つまり、2の31乗で2GBしか使えないというのがでてくることになる。
言語仕様的に、というか普通に開発していて(暗黙的に)ポインタがunsignedになるという状況はほぼありえないだろうからそういうものなのだろうかな?と邪推してみた。
まぁ、セカンドPCはSocket939のマザーボードな上に、32bit Windowsに依存したものを今後使う予定でいるので、32bit環境で残していくつもりでいる。大容量のメモリを生かした64bit環境はメインPC(といいつつ出番が少ない)で作ってあるのでそっちを使えばいいだろうということにする。
コメント