C#编译与尾递归优化?

时间:2015-04-10 21:24:56

标签: c# c#-4.0 recursion tail-recursion

基于丰富的stackoverflow,我一直在研究是否对特定的c#代码进行尾递归优化。一些问题似乎在谈论

  1. 推测正在发布的.net新版本的优化
  2. 将应用程序构建为x64bit应用程序以实现优化
  3. 在Visual Studio中从调试版本切换到发布版本以实现优化
  4. 根本没有优化,并且微软社区声称他们不会针对“安全问题”进行尾递归优化(并不是真的理解这个问题)
  5. 它是随机发生的
  6. 从C#4.0(Visual Studio 2013/2015)开始,如果可以确保尾递归优化,如何确保尾递归优化?

1 个答案:

答案 0 :(得分:20)

可以支持尾调用优化的不同级别。 JIT真正负责发生的许多优化。 C#编译器本身甚至不进行方法内联,这是JIT编译器的职责。 C#编译器可以使用Tailcall IL opcode指定一个调用作为尾调用,但我相信没有版本的C#编译器可以做到这一点。允许JIT编译器在认为合适时进行尾调用优化。特别是,我相信只有64位JIT才能做到这一点。此blog post概述了JIT64无法使用尾调用优化的多种情况。我确信这些标准可能会有所变化,因为他们正在重写代号为RyuJIT的JIT编译器。

如果您想要一个可以使用TCO的简短程序示例,请尝试以下方法:

class Program
{
    static void Main(string[] args)
    {
        Test(1);
    }

    private static void Test(int i)
    {
        Console.WriteLine(i);
        Test(i + 1);
    }
}

将项目设置为构建Release / x64(或不喜欢32位的AnyCPU),并在没有附加调试器的情况下启动。该计划将永远运行。如果我不做所有这些事情,那么我会在20947左右得到一个stackoverflow异常。