COM コンポーネントも PInvoke も使用しない純粋な .NET アプリケーションを想像してみてください。ターゲット システムが 32 ビットか 64 ビットかは重要ですか?
3 に答える
アプリケーションがAnyCPUをターゲットにしている場合、実行時の動作、特にメモリ使用量と制限が異なります。
64ビットでは、同じ32ビットメモリの制限はありません(理論的には最大2GBのメモリですが、実際には1.2〜1.6)。ただし、すべてのオブジェクト参照は2倍の大きさであるため、64ビットシステムはより多くのメモリを使用します。
また、64ビットシステムには追加のレジスタなどがあることが多いため、パフォーマンスがわずかに向上する場合があります。ただし、これはプラットフォーム固有です。
アプリケーションがx86をターゲットにしている場合、WoW64で実行され、32ビットシステムでの動作とほぼ同じように動作します。
COMコンポーネント、P / Invokeなどのない安全なコードを想定すると、セマンティックの違いはないはずですが、パフォーマンスに影響を与える可能性があります。考えてみてください。64ビットではメモリが増えますが、参照は大きくなります。いくつか勝ち、いくつかを失う。
とにかく、ここにいくつかの有用な参考資料があります:
- MSDN:32ビットマネージコードの64ビットへの移行を参照してください。引用:
"[...] 100%タイプセーフなコードである.NETアプリケーションを考えてみましょう。このシナリオでは、32ビットマシンで実行している.NET実行可能ファイルを64ビットシステムに移動して、アセンブリは100%タイプセーフであるため、ネイティブコードまたはCOMオブジェクトへの依存関係がなく、アプリケーションが完全に制御下で実行されることを意味する「安全でない」コードがないことがわかります。 CLRは、ジャストインタイム(JIT)コンパイルの結果として生成されるバイナリコードが32ビットと64ビットで異なる一方で、実行されるコードが両方とも意味的に同じであることを保証します。 。[...]」
Reed Copseyによって識別されたものとは別に、問題になる可能性のある別の方法は、「純粋な」アプリケーションがたまたまSystem.IntPtr構造体を使用しているか、安全でないコードを使用しているか(P / Invokeと同じではない)です。 )およびポインタ演算。
注意すべきもう1つの大きな問題は、 System.Runtime.InteropServices.Marshalクラスのほとんどすべての呼び出しです。そこに足を踏み入れるための素晴らしい方法はたくさんあります(もちろん、必要なときに非常に便利です)。