12

.localsIL では、ディレクティブを使用してローカル変数を定義できます。これらの変数は、スタックまたはヒープのどこに保存されますか?

4

3 に答える 3

9

これは、JITコンパイラの実装の詳細です。ローカル変数をCPUレジスタに格納するのは非常に困難で、非常に効率的です。すべてのローカル変数を格納するのに十分なレジスタが利用できない場合に備えて、スタックは通常のバッキングストアです。

たとえば、x86とx64のジッターの大きな違い。x64にはさらに多くのレジスタがあります。これは、メソッドに渡される引数にも当てはまります。x86ではCPUレジスタに2を渡すことができ、x64では4を渡すことができます。さらに、FPUスタックまたはXMMレジスタに格納できるものは何でもかまいません。したがって、ローカル変数を格納できる場所は実際には4つあります。

于 2010-09-29T14:41:34.077 に答える
9

パラメータ付きのスタック上。..しかし.....
1) 参照型の場合、参照先のオブジェクトではなく、参照のみがスタックに格納されます。実際のオブジェクトはヒープに格納されます。
2) 値型の場合、実際の値はスタックに格納されます。

メソッドの実行フローが右中括弧に到達すると、スタック上の値型データがそこで破棄され、ヒープ上の参照型オブジェクト (参照はこのメソッドのスタック上にあった) がガベージ コレクションに渡されます。ガベージコレクタ自身が決定した適切な時期に収集するためのシステム。

于 2010-09-29T14:26:29.557 に答える
4

オブジェクトが値型でない場合は、ヒープに割り当てられ、それへの参照がスタックに格納されます。それ以外の場合は、スタックに直接割り当てられます。

于 2010-09-29T14:24:47.733 に答える