.NET中有没有办法使用Reflection.Emit
来访问堆栈中最顶层的项目?因此,如果A是最顶层,B则是下一个 - 我想处理B然后是A.可以复制B 上面 A(因为当我到达它时我可以简单地“弹出”第二个B )。
目前,我宣布当地:
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
是否存在不需要显式本地的路由?
答案 0 :(得分:7)
我不这么认为。在IL中没有任何像swap这样的指令可以让你做你想做的事。为什么你认为使用当地人是令人反感的?如果JIT编译器足够好,这将不会导致比在IL中使用假设的交换操作更慢的机器代码。
答案 1 :(得分:1)
+1,请参阅:http://www.codeproject.com/KB/msil/msilenhancement.aspx
答案 2 :(得分:1)
与kvb所说的一致,你可以尝试一个小函数来做一些重新排序。不确定它是否会更快。
答案 3 :(得分:1)
我遇到了同样的问题。我想生成一个相当大的方法,我经常想'交换'以存储计算值。我对ildasm出现的大量当地人感到不满,并注意到BeginScope / EndScope没有任何帮助。我结束了为我的方法的上下文创建一个本地'swap',并重新使用它进行每个交换操作。它使生成的IL更清洁;不确定它是否对性能有任何有意义的影响。