size_t
可能な限り最大の単一の連続オブジェクトを格納するのに十分な大きさが必要です。これは、アドレス空間のサイズと同じではない場合があります (たとえば、セグメント化されたメモリ モデルを使用するシステムの場合) 。
ただし、フラットなメモリ空間を備えた一般的なプラットフォームでは、この 2 つは同等であるためsize_t
、ターゲット CPU がわかっている場合は、実際に使用しても問題ありません。
とにかく、これは本当に有用なことを教えてくれません。確かに、32 ビットの CPU には 4GB のメモリ空間size_t
があり、32 ビットの符号なし整数も同様です。しかし、それはあなたがどれだけ割り当てることができるかについては何も言いません. メモリ空間の一部は OS によって使用されます。また、いくつかの部分は、独自のアプリケーションで既に使用されています: 実行可能ファイルをメモリ (およびそれが使用する可能性のある動的ライブラリ) にマッピングするため、各スレッドのスタック、ヒープに割り当てられたメモリなど。
いいえ、サイズを取得するなどのトリックは、size_t
実行しているアドレス空間について少し教えてくれますが、あまり使用できるものはありません. プロセスやその他のメトリックで使用されているメモリの量を OS に問い合わせることができますが、これもあまり役に立ちません。プロセスが数メガバイトを使用することは可能ですが、それが非常に多くの小さな割り当てに分散しているため、たとえば 100MB を超える連続したメモリ ブロックを見つけることができません。そのため、32 ビット マシンでは、プロセスがほとんどメモリを使用しないため、このような割り当てを行うことはまずありません。(そして、OS に魔法のWhatIsTheLargestPossibleMemoryAllocationICanMake()
API があったとしても、それは役に立ちません。それは、直前に必要だったものを教えてくれるでしょう。. ファイルをマップしようとした時点で、回答がまだ有効であるという保証はありません。
したがって、実際にできる最善の方法は、ファイルをマップしてみて、失敗するかどうかを確認することです。