スタックは、純粋に管理されていない実装の詳細です。プロセッサは何かを得るためにスタックを必要とし、それがなければ意味のあるコードを実行することはできません。これはスレッドに強く結びついています。通常のCLRホスト上の別の純粋に管理されていない詳細です。
スレッドが作成されたときにOSカーネルがそれを割り当てることを決めたメモリ内にあります。ランダムです。意図的にランダムに悪意のあるプログラムを実行すると、スタックは悪意のあるコードにデータを変換する魅力的な方法です。場所がランダムであるだけでなく、スタックが開始するスタックセグメント内の正確なオフセットもランダムです。
作成後も決して移動しません.GCはそれを変更しません。それについて知る必要があります、オブジェクトのルートはスタックに格納することができます。信頼できるスタックウォークはハードな.NET要件であり、プログラムが未処理の例外で終了したときにCLRが常に優れたスタックトレースを生成できるという基本的な理由もあります。スタック領域の不足は深刻な問題であり、プロセッサはコードを実行し続けることができません。その問題の後でプログラマのWebサイトに名前を付けるのに十分なだけです:)
これは、特定のCLR実装、基礎となるOS、さらにはCPUアーキテクチャに関しても非常に重要です。たとえば、Windowsでは、スレッドスタックをx86/x64メモリ管理の仕組みとインラインで割り当てる(および拡張する)ための特定のサポートがあります。 –
確かに。 C#言語には、スタックがまったく存在しないという要件はほとんどありません(実際にはスタックの割り当て - C#言語仕様には 'stack'が44回しかなく、その半分は' Stack'というサンプルクラスです) –