27

.maxstackが実際にどのように機能するのか知りたいのですが。宣言しているタイプの実際のサイズではなく、タイプの数と関係があることを私は知っています。私の質問は次のとおりです。

  1. これは関数だけに当てはまりますか、それとも私たちが求めているすべての関数に当てはまりますか?
  2. .maxstackが宣言されている関数の場合でも、分岐している場合、maxstackが何であるかをどのように知ることができますか?あなたは行ってすべての「パス」を見て、可能な最大値を返しますか?
  3. 16に設定し、実際に17個の変数がある場合はどうなりますか?
  4. 256に設定した場合、ペナルティが大きすぎますか?
4

3 に答える 3

27

.maxstackIL検証の一部です。基本的.maxstackに、メソッド用に予約する必要のある最大スタックサイズをJITに通知します。たとえば、次のようにx = y + (a - b)変換されます

(疑似IL :)

1. Push y on the stack
2. Push a on the stack
3. Push b on the stack
4. Pop the last two items from the stack,
      substract them and
      push the result on the stack
5. Pop the last two items from the stack,
      add them and
      push the result on the stack
6. Store the last item on the stack in x and
      pop the last item from the stack

ご覧のとおり、スタックには常に最大3つのアイテムがあります。.maxstackこのメソッドを2(またはそれ以下)に設定すると、コードは実行されません。

また、無限のスタックサイズが必要になるため、このようなものを使用することはできません。

1. Push x on the stack
2. Jump to step 1

あなたの質問に答えるには:

  1. これは関数だけに当てはまりますか、それとも私たちが求めているすべての関数に当てはまりますか?

機能のためだけに

  1. .maxstackが宣言されている関数の場合でも、分岐している場合、maxstackが何であるかをどのように知ることができますか?あなたは行ってすべての「パス」を見て、可能な最大値を返しますか?

あなたは行ってすべてのパスを見て、可能な最大値を返します

  1. 16に設定し、実際に17個の変数がある場合はどうなりますか?

変数の数とは関係ありません。LasseV。Karlsenの回答を参照してください。

  1. 256に設定した場合、ペナルティが大きすぎますか?

良い考えではないようですが、わかりません。

あなたは本当に.maxstack自分自身を計算する必要がありますか?System.Reflection.EmitIIRCのためにそれを計算します。

于 2009-08-07T08:35:20.623 に答える
6

宣言された変数の数とは関係ありませんが、代わりに、式を計算するために任意の時点でスタックにプッシュする必要のある値の数と関係があります。

たとえば、次の式では、2つの値をスタックにプッシュする必要があると想定しています。

x = y + z;

これは、x、y、zの少なくとも3つの変数が存在し、場合によっては他の変数も存在するという事実とは関係ありません。

残念ながら、私はあなたの他の質問に対する答えを知りません、そして私は実験がいくつかの答えを見つける一つの方法であると思います。

于 2009-08-06T20:45:13.847 に答える