ホームページ >バックエンド開発 >C++ >C# スタック サイズが 1 MB (32 ビット) と 4 MB (64 ビット) に制限されているのはなぜですか?

C# スタック サイズが 1 MB (32 ビット) と 4 MB (64 ビット) に制限されているのはなぜですか?

Mary-Kate Olsen
Mary-Kate Olsenオリジナル
2025-01-21 18:11:10233ブラウズ

Why are C# Stack Sizes Limited to 1 MB (32-bit) and 4 MB (64-bit)?

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 サイトの他の関連記事を参照してください。

声明:
この記事の内容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰属します。このサイトは、それに相当する法的責任を負いません。盗作または侵害の疑いのあるコンテンツを見つけた場合は、admin@php.cn までご連絡ください。