.net Emit-从堆栈中访问最顶层但只有一项

.net Emit-从堆栈中访问最顶层但只有一项,.net,reflection.emit,.net,Reflection.emit,在.NET中,是否有一种方法可以使用Reflection.Emit,从堆栈中访问最顶层但只有一项?因此,如果A是最上面的,B是下一个-我想先处理B,然后处理A。在A上面复制B是很好的(因为当我到达它时,我可以简单地“弹出”第二个B) 目前,我正在声明一个本地: LocalBuilder loc = il.DeclareLocal(typeof(Foo)); il.Emit(OpCodes.Stloc, loc); // store and pop topmost stack it

在.NET中,是否有一种方法可以使用
Reflection.Emit
,从堆栈中访问最顶层但只有一项?因此,如果A是最上面的,B是下一个-我想先处理B,然后处理A。在A上面复制B是很好的(因为当我到达它时,我可以简单地“弹出”第二个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

是否有一条路线不需要显式的本地路径?

我不这么认为。在IL中,没有任何像swap这样的指令可以让你做你想做的事情。为什么你认为使用本地语言是令人反感的?如果JIT编译器足够好,这不会导致任何比在IL中使用假设的交换操作更慢的机器代码。

+1有关kvb答案,请参阅:

与kvb所说的内容内联,您可以尝试一个小函数来进行一些重新排序。不确定是否会更快。

我遇到了同样的问题。我想生成一个相当大的方法,我经常想“交换”以存储计算值。我对大量本地人出现在ildasm感到不满,并注意到BeginScope/EndScope没有任何帮助。最后,我为方法的上下文创建了一个本地“交换”,并在每次交换操作中重用它。它使生成的IL更清洁;不确定它是否对性能有任何有意义的影响。

至于“为什么”——这是在生成的代码中,必须引入我想要的更多局部变量。如果我可以使用堆栈的顶部,我可以节省大量的堆栈空间(不管使用情况如何,局部变量都是保留的);即使JUT将其内联,代码项目的作者也和我有类似的想法。交换或交换就可以了-p我将不得不检查我的4.0虚拟机,但我不希望它有任何不同。。。