1

すべての人が、値型はスタックに格納されていると言っています。しかし、値型が格納されるスタックのサイズはどれくらいですか?誰もそれについて説明しません。

4

2 に答える 2

1

メソッドのスタック フレームのサイズを計算するのはジッターの仕事です。これは、メソッド内のすべてのローカル変数のサイズの合計を単純に加算したものです。small 値型はすべて 4 バイト、long 型と double 型は 8 バイト、decimal 型は 16 バイト、struct は整列されたメンバーの合計サイズになります。参照型の参照は、32 ビット モードで 4 バイト、64 ビット モードで 8 バイトを使用します。

さらに洗練されたのは、ジッター オプティマイザーがローカル変数を CPU レジスターに移動できることです。これにより、コードが高速化され、スピルする必要がない場合は必要なスタック フレーム ストレージが削減されます。

ネストされたメソッド呼び出しのスタック フレームのサイズの合計に、保存された CPU レジスタ、戻りアドレス、およびメソッド引数のオーバーヘッドを加えたものが、割り当てられたスタックのサイズを超えることはできません。デフォルトでは、32 ビット コードの場合は 1 メガバイト、ターゲットとして x64 でコンパイルされたコードの場合は 4 メガバイトです。または、Thread クラス コンストラクターのmaxStackSize引数。割り当てられたサイズを超えると、このサイトの名前の由来である致命的な例外が発生します。

実際の結果は、使用されているジッター (x86 対 x64 対 ARM) に大きく依存します。また、デバッグ ビルドとリリース ビルドのどちらを使用するか。したがって、これを完全な実装の詳細と見なす必要があります。

于 2012-11-27T13:53:54.603 に答える
0

スタック サイズは構成可能で、いくつかの異なる方法で設定できます

デフォルトでは、に設定されてい1 MBます。ASP.NET アプリの場合は256 KB(詳細はこちら)。

于 2012-11-27T08:19:13.247 に答える