C# スタック サイズが 1MB のままなのはなぜですか?その歴史的および技術的な理由を探ります
現代の PC には十分な物理メモリがあるため、C# のスタック サイズは 32 ビット プロセスの場合は 1MB、64 ビット プロセスの場合は 4MB に留まっており、この一見恣意的な制限の背後にあるロジックについて疑問が生じています。
歴史的起源: Windows NT の遺産
デフォルトのスタック サイズ 1MB は、もともと Windows NT の開発中に確立されました。実行可能ファイルまたは CreateThread() API 呼び出しで特定のスタック サイズが指定されていない場合、オペレーティング システムはデフォルトでこの値を使用します。
1MB を選択する理由
1MB の選択は、さまざまな要因の影響を受ける可能性があります。まず、パーソナル コンピューターの初期には、かなりの量のメモリが必要でした。第 2 に、Windows NT のデマンド ページ仮想メモリ アーキテクチャにより、スタックを仮想的に割り当てることができ、物理メモリへの影響を最小限に抑えることができます。
.NET プログラムの過剰割り当て
要求の厳しいネイティブ プログラムの場合は 1MB で十分かもしれませんが、.NET アプリケーションの場合は大きすぎることがわかります。 .NET では、文字列と配列がマネージド ヒープに割り当てられるため、スタックの消費が削減されます。さらに、安全でないポインターと stackalloc はほとんど使用されません。
JIT コンパイルとスタックの使用法
.NET における唯一の重要なスタック使用量は、実行時のジャストインタイム (JIT) コンパイル中に発生します。スタックはコードの最適化と例外処理に使用されますが、通常は数万バイトしか必要としません。
スタック占有
.NET の特徴は、スタックが占有され、スワップの可能性のためにページング ファイル内にスペースを確保することです。このコストのかかるプロセスは、当初はセキュリティ対策として実装されましたが、その後は廃止されました。
最新の変更: スタック占有がなくなりました
.NET の最近のバージョン (.NET 4.5 以降) では、CLR はパフォーマンス上の理由からスタックの占有を排除しました。この変更により、メモリ使用量に対するスタック サイズの影響がさらに軽減されます。
結論
C# の 1MB スタック サイズは歴史的な成果であり、初期のコンピューティング プラットフォームの制限の影響を受けています。最新のハードウェアの機能を考えると時代遅れに見えるかもしれませんが、メモリ オーバーヘッドが比較的低く、ほとんどのアプリケーションにとって十分な容量があるため、依然として合理的なデフォルトです。
以上がデフォルトの C# スタック サイズが 1 MB (64 ビットの場合は 4 MB) のままなのはなぜですか?の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。