「任意のCPU(32ビットを推奨)」で.NET 4.5でx86よりも多くのメモリを割り当てることができるのはなぜですか?

セブウィルズ

多くのSOの回答とこの広く引用されているブログ投稿によると、「32ビットを優先」オプションが選択された「任意のCPU」用に構築された.NET 4.5アプリケーションは、32ビットと64ビットの両方で32ビットプロセスとして実行されます。システム(.NET 4.0以前とは異なります)。つまり、「32ビットを優先」が選択されたx86とAnyCPUは同等です(ARMで実行できるかどうかは無視されます)。

ただし、私のテストでは、64ビットシステムでは、「AnyCPUは32ビットを優先する」アプリケーション(32ビットで実行されることを確認しています)は、x86アプリケーションよりも多くのメモリを割り当てることができることが示されています。OutOfMemoryExceptionが発生するまでループ内で10MBバイト配列を割り当てる(もちろん参照を保持する).NET 4.5 C#コンソールアプリを作成し、十分なRAMを備えた64ビットシステムで実行しました。x86としてビルドすると、割り当てられた約1.2GBでフォールオーバーします。「任意のCPU(32ビットを推奨)」と同じコードを作成すると、最大1.5GBになります。

なぜ違いがあるのですか?

セブウィルズ

Visual Studio 2015では、「AnyCPU(32ビットを推奨)」としてビルドすると、実行可能ファイルにIMAGE_FILE_LARGE_ADDRESS_AWAREビットが設定されます(実行中と同等editbin /LARGEADDRESSAWARE)が、x86ビルドでは設定されません。これはdumpbin /HEADERS、「アプリケーションは大きな(> 2GB)アドレスを処理できます」という行で確認できます

これはVisualStudio2013に当てはまりません。変更は明らかに文書化されていません

理論的には、これによりCLRにさらに2GBを追加して使用できるようになります。割り当て可能なメモリが約300MBしか増えない理由はわかりません。

この記事はインターネットから収集されたものであり、転載の際にはソースを示してください。

侵害の場合は、連絡してください[email protected]

編集
0

コメントを追加

0

関連記事

Related 関連記事

ホットタグ

アーカイブ