C#编译尾部递归优化?

基于丰富的stackoverflow财富,我一直在回答关于尾递归优化是否针对特定的c#代码。 一些问题似乎在谈论

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


    有不同的级别可以支持尾部呼叫优化。 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);
        }
    }
    

    将该项目设置为构建Release / x64(或不带任何附加调试器的AnyCPU,无需使用32位)并启动。 该计划将永远运行。 如果我不做所有这些事情,那么我会在20947左右得到一个stackoverflow例外。

    链接地址: http://www.djcxy.com/p/80611.html

    上一篇: C# compilation with tail recursive optimization?

    下一篇: Why doesn't .NET/C# optimize for tail