C# のスタック サイズの制限: 1 MB (32 ビット) と 4 MB (64 ビット) について
今日の豊富な RAM にも関わらず、C# スタック サイズは、32 ビット プロセスの場合は 1 MB、64 ビット プロセスの場合は 4 MB に制限されたままです。 この一見恣意的な制限は、Windows NT の歴史的な設計に由来しています。
David Cutler のチームによって設定された元の 1 MB のデフォルトは、文字列やバッファを処理するために大きなスタック フレームを作成することが多いネイティブ アプリケーションの標準でした。 この慣行はバッファ オーバーフロー攻撃に対して脆弱であり、C# などのマネージ コードでスタック フレーム サイズを制限する決定に影響を与えました。
.NET アプリケーションは主に文字列と配列をガベージ コレクション (GC) ヒープに割り当てますが、1 MB のスタックを維持することでネイティブ コードとの互換性が確保されます。 .NET でのスタックの主な使用は JIT コンパイル中に行われ、消費するのはわずか数十キロバイトです。
共通言語ランタイム (CLR) の初期バージョンでは、スタック領域が事前に割り当てられ、信頼性の高いスワッピングのためにページング ファイル内にスタック領域が予約されていました。 最新のオペレーティング システムと RAM の増加により、これは不要になりました。 CLR は事前割り当てを行わなくなり、大きなスタック サイズの必要性がさらに減りました。
要約すると、サイズ制限は歴史的背景とネイティブ プログラムとの互換性を反映しています。現在のサイズは小さいように見えますが、ほとんどの C# アプリケーションに十分なスペースを提供し、下位互換性を確保し、メモリ オーバーランを防ぎ、予測可能な JIT コンパイル リソース使用量を維持します。
以上がC# スタック サイズが 1 MB (32 ビット) と 4 MB (64 ビット) に制限されているのはなぜですか?の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。