すべての人が、値型はスタックに格納されていると言っています。しかし、値型が格納されるスタックのサイズはどれくらいですか?誰もそれについて説明しません。
2 に答える
メソッドのスタック フレームのサイズを計算するのはジッターの仕事です。これは、メソッド内のすべてのローカル変数のサイズの合計を単純に加算したものです。small 値型はすべて 4 バイト、long 型と double 型は 8 バイト、decimal 型は 16 バイト、struct は整列されたメンバーの合計サイズになります。参照型の参照は、32 ビット モードで 4 バイト、64 ビット モードで 8 バイトを使用します。
さらに洗練されたのは、ジッター オプティマイザーがローカル変数を CPU レジスターに移動できることです。これにより、コードが高速化され、スピルする必要がない場合は必要なスタック フレーム ストレージが削減されます。
ネストされたメソッド呼び出しのスタック フレームのサイズの合計に、保存された CPU レジスタ、戻りアドレス、およびメソッド引数のオーバーヘッドを加えたものが、割り当てられたスタックのサイズを超えることはできません。デフォルトでは、32 ビット コードの場合は 1 メガバイト、ターゲットとして x64 でコンパイルされたコードの場合は 4 メガバイトです。または、Thread クラス コンストラクターのmaxStackSize引数。割り当てられたサイズを超えると、このサイトの名前の由来である致命的な例外が発生します。
実際の結果は、使用されているジッター (x86 対 x64 対 ARM) に大きく依存します。また、デバッグ ビルドとリリース ビルドのどちらを使用するか。したがって、これを完全な実装の詳細と見なす必要があります。
スタック サイズは構成可能で、いくつかの異なる方法で設定できます。