9

.NET 中有没有办法使用Reflection.Emit, 来访问堆栈中最顶层但只有一个的项目?因此,如果 A 是最上面的,然后是 B - 我想处理 B 然后是 A。在 A上方复制 B 会很好(因为当我到达第二个 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

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

4

4 回答 4

7

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

于 2009-04-05T03:05:00.787 回答
1

+1 获取 kvbs 答案,请参阅: http: //www.codeproject.com/KB/msil/msilenhancement.aspx

于 2009-04-05T07:09:36.143 回答
1

与 kvb 所说的一致,您可以尝试一个小功能来进行一些重新排序。不确定它是否会更快。

于 2009-04-05T07:18:47.180 回答
1

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

于 2009-11-25T04:24:19.223 回答