相关疑难解决方法(0)

为什么.NET/C#不能优化尾调用递归?

我发现这个问题关于哪些语言优化尾递归.为什么C#不会优化尾递归?

对于具体情况,为什么不将此方法优化为循环(Visual Studio 2008 32位,如果这很重要)?:

private static void Foo(int i)
{
    if (i == 1000000)
        return;

    if (i % 100 == 0)
        Console.WriteLine(i);

    Foo(i+1);
}
Run Code Online (Sandbox Code Playgroud)

.net c# optimization tail-recursion

102
推荐指数
4
解决办法
3万
查看次数

IL#指令未被C#公开

C#没有暴露哪些IL指令?

我指的是像sizeof和cpblk这样的指令 - 没有执行这些指令的类或命令(C#中的sizeof是在编译时计算的,而不是在运行时AFAIK计算的).

其他?

编辑:我问这个的原因(并希望这将使我的问题更有效)是因为我正在开发一个小型库,它将提供这些指令的功能.sizeof和cpblk已经实现 - 我想知道在继续之前我可能错过了什么.

编辑2:使用Eric的答案,我编写了一份说明列表:

  • 打破
  • JMP
  • 愈伤组织
  • Cpobj
  • Ckfinite
  • 前缀[1-7]
  • Prefixref
  • Endfilter
  • 未对齐
  • 尾调用
  • Cpblk
  • Initblk

列表中没有包含许多其他指令,我将它们分开,因为它们基本上是其他指令的快捷方式(压缩以节省时间和空间):

  • Ldarg [0-3]
  • Ldloc [0-3]
  • Stloc [0-3]
  • Ldc_ [I4_ [M1/S/0-8]/I8/R4/R8]
  • Ldind_ [I1/U1/I2/U2/I4/U4/I8/R4/R8]
  • Stind_ [I1/I2/I4/I8/R4/R8]
  • Conv_ [I1/I2/I4/I8/R4/R8/U4/U8/U2/U1]
  • Conv_Ovf_ [I1/I2/I4/I8/U1/U2/U4/U8]
  • Conv_Ovf_ [I1/I2/I4/I8/U1/U2/U4/U8] _Un
  • Ldelem_ [I1/I2/I4/I8/U1/U2/U4/R4/R8]
  • Stelem_ [I1/I2/I4/I8/R4/R8]

c# il instructions

33
推荐指数
2
解决办法
2659
查看次数

标签 统计

c# ×2

.net ×1

il ×1

instructions ×1

optimization ×1

tail-recursion ×1