.maxstack
IL検証の一部です。基本的.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
あなたの質問に答えるには:
- これは関数だけに当てはまりますか、それとも私たちが求めているすべての関数に当てはまりますか?
機能のためだけに
- .maxstackが宣言されている関数の場合でも、分岐している場合、maxstackが何であるかをどのように知ることができますか?あなたは行ってすべての「パス」を見て、可能な最大値を返しますか?
あなたは行ってすべてのパスを見て、可能な最大値を返します
- 16に設定し、実際に17個の変数がある場合はどうなりますか?
変数の数とは関係ありません。LasseV。Karlsenの回答を参照してください。
- 256に設定した場合、ペナルティが大きすぎますか?
良い考えではないようですが、わかりません。
あなたは本当に.maxstack
自分自身を計算する必要がありますか?System.Reflection.Emit
IIRCのためにそれを計算します。