現在プログラムが64bit OSで実行中であるか否かは、Environment.Is64BitOperatingSystemで簡単に判定できます。
しかし、64bit OSでも32bitプロセスで実行してしまう可能性があります。
プロセスが64bitか否かはEnvironment.Is64BitProcessで簡単に判定できます。
これとは別にポインターのサイズが32bitから64bitか調べる方法もあります。IntPtr.Sizeの値が4なら32bit、8なら64bitです。
ただ、プロセスが64bitならポインターも64bitという前提を置いても現状では問題ないので、あまり使う機会はないかもしれません。
罠の数々 §
- 通常、【OSのビット数≠プロセスのビット数≠ポインターのビット数】となる。たとえば64bit OSで32bitのプロセスを実行することは普通だし、昔の8bit CPUならポインターは16bitである。しかし、煩雑なのでイコールと見なして運用することが多い。しかし、多いだけで必ずそうとも言い切れない。注意しておこう
- 通常C#のプログラマーはポインターを意識する必要はない。しかし、ポインターのサイズは参照を保存するために必要なメモリサイズに直結するので、ポインターのサイズを意識することはメモリ節約につながる
参考リンク §
Environment.Is64BitOperatingSystem プロパティ
Environment.Is64BitProcess プロパティ
定
IntPtr.Size プロパティ
上の2つはEnvironmentクラスなのに、最後の1つはIntPtrクラスである。なぜIntPtr.Size プロパティだけクラスが違うのだろうか。上記のリンクを辿って理由を考えてみよう。
リポジトリ §
https://github.com/autumn009/cshowto
Environment §
using System;
class Program
{
static void Main()
{
bool is64bitOS = Environment.Is64BitOperatingSystem;
bool is64bitProcess = Environment.Is64BitProcess;
bool is64bitPointer = IntPtr.Size == 8;
Console.WriteLine((is64bitOS? "64":"32")+"bit OSです。");
Console.WriteLine((is64bitProcess ? "64" : "32") + "bit プロセスです。");
Console.WriteLine((is64bitPointer ? "64" : "32") + "bit ポインターです。");
}
}
実行結果 (実行する環境で変化する)
64bit OSです。
64bit プロセスです。
64bit ポインターです。