基于丰富的stackoverflow,我一直在研究是否对特定的c#代码进行尾递归优化。一些问题似乎在谈论
从C#4.0(Visual Studio 2013/2015)开始,如果可以确保尾递归优化,如何确保尾递归优化?
答案 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异常。