2009-04-04 6 views
9

Reflection.Emitを使用して.NETにスタックから一番上のアイテムにアクセスする方法はありますか?だからAが一番上、Bの次がBならばAを処理したいと思っています.B Aの上に複製するといいでしょう。Reflection.Emit - スタックから一番上のアイテムにアクセスする

現在、私は地元を宣言しています:

LocalBuilder loc = il.DeclareLocal(typeof(Foo)); 
    il.Emit(OpCodes.Stloc, loc); // store and pop topmost stack item 
    // work with (pop) previous stack item 
    il.Emit(OpCodes.Ldloc, loc); // push old topmost stack item 

は、明示的なローカルを必要としないルートはありますか?

答えて

7

私はそうは思わない。イリノイ州では、スワップのような、あなたが望むことをするための指示はありません。なぜあなたは地元の人を不快に感じるのですか? JITコンパイラが十分あれば、ILで仮想的なスワップ操作を使用するよりも、マシンコードが遅くなることはありません。

+1

"なぜ"のために - これは私が望むより多くの地元を紹介しなければならない生成コードです。代わりにスタックの一番上を使うことができれば、スタックのスペースを節約することができます(AFAIKに関係なくローカルに予約されています)。 –

1

1 kvbsの答えのために、以下を参照してください言っKVBとhttp://www.codeproject.com/KB/msil/msilenhancement.aspx

+0

codeprojectの作者は私と同じような考えを持っています。 SWAPまたはそれ以上は仕事をするだろう;-p私の4.0 VMをチェックする必要があるだろうが、私はそれがそこに異なっていることを期待していないよ... –

1

インライン、あなたには、いくつかの並べ替えを行うには、小さな機能を試すことができます。それがもっと速くなるかどうかはわかりません。

+0

良い考えが、ほとんど確かに; JUTがそれをインライン化したとしても。 –

1

この同じ問題が発生しました。私はかなり大きなメソッドを生成したいと思っていました。計算された値を格納するためにしばしば 'スワップ'したいと思っていました。私はildasmに現れた大勢の地元住民に不満を抱き、BeginScope/EndScopeは何の助けにもならなかったことに気づいた。私は、私のメソッドのコンテキストのためのローカルな「スワップ」を作成し、それをすべてのスワップ操作に再利用しました。生成されたILをきれいにします。パフォーマンスに意味のある影響があるかどうかは不明です。

関連する問題