C# スタック サイズ: 1 MB の制限について理解する
現代のコンピューターには膨大な量の RAM が搭載されていますが、C# のデフォルトのスタック サイズは依然として制限されており、32 ビット プロセスの場合は 1 MB、64 ビット プロセスの場合は 4 MB です。 この記事では、この一見少ない割り当ての背後にある理由を探ります。
歴史的背景
1 MB のデフォルトは、.NET Framework と C# の両方より前から存在しています。これは、明示的なスタック サイズ宣言のないアプリケーションの標準スタック サイズとして Windows NT の設計で確立されました。 Windows NT のアーキテクトである David Cutler がこの決定を下しました。 正確な理由は不明ですが、ネイティブ Windows NT プログラムの要件によって引き起こされたものと考えられています。
ネイティブ アプリケーションと .NET アプリケーション
ネイティブ アプリケーションは文字列とバッファに大きなスタック フレームを使用することが多いため、バッファ オーバーフローの悪用に対して脆弱になります。 1 MB の制限により、ある程度の保護が提供されました。
ただし、.NET アプリケーションは文字列と配列をガベージ コレクション (GC) ヒープ上で管理するため、バッファ オーバーフローのリスクが大幅に軽減されます。 .NET JIT コンパイラは主にコンパイル中にスタックを使用するため、割り当てられたスタック領域のごく一部しか必要としません。
現代の意味
.NET のメモリ管理とセキュリティが進歩したにもかかわらず、下位互換性と過剰なメモリ消費を避ける必要があるため、1 MB の制限は依然として残ります。 ただし、開発者は、大規模な配列や複雑な再帰アルゴリズムを扱う場合など、このデフォルトでは不十分なシナリオに遭遇する可能性があります。 このような場合、より大きなスタック サイズを手動で指定できます。
スタックコミットメント
古い .NET バージョンでは、スタック全体がコミットされ、仮想メモリとページング ファイル スペースが確保されていました。これにより安定性は確保されましたが、パフォーマンスに影響を与えました。 最新の .NET バージョンでは、デフォルトでスタックをコミットせず、必要に応じて物理メモリを割り当てるだけです。 これにより、安定性を犠牲にすることなく効率が向上します。
以上がC# のデフォルトのスタック サイズが 1 MB (32 ビット) と 4 MB (64 ビット) に制限されているのはなぜですか?の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。