C#编译尾部递归优化?
基于丰富的stackoverflow财富,我一直在回答关于尾递归优化是否针对特定的c#代码。 一些问题似乎在谈论
因此,从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