C#编译与尾递归优化?

Ben*_*Yeo 12 c# recursion tail-recursion c#-4.0

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

  1. 推测正在发布的更新版本的.net中的优化
  2. 构建应用程序作为x64bit应用程序来实现优化
  3. 在Visual Studio中从调试版本切换到发布版本以实现优化
  4. 根本没有优化,并且微软社区声称他们不会对"安全问题"进行尾递归优化(实际上并不理解这个问题)
  5. 它是随机发生的

从C#4.0(Visual Studio 2013/2015)开始,如果可以确保尾递归优化,如何确保尾递归优化呢?

Mik*_*ray 21

可以支持尾调用优化的不同级别.JIT真正负责发生的许多优化.C#编译器本身甚至不进行方法内联,这是JIT编译器的职责.C#编译器可以使用Tailcall IL操作码将一个调用指定为尾调用,但我相信没有版本的C#编译器可以做到这一点.允许JIT编译器在认为合适时进行尾调用优化.特别是,我相信只有64位JIT才能做到这一点.此博客文章概述了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);
    }
}
Run Code Online (Sandbox Code Playgroud)

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