基于stackoverflow丰富的资源,我已经对是否专门针对c#代码进行尾递归优化得到了答案。其中一些问题似乎涉及以下几点:
- 推测在新版本的.net中进行了优化
- 构建应用程序为x64位应用程序以实现优化
- 在Visual Studio中从调试生成切换到发布生成以实现优化
- 完全没有优化,微软社区声称他们不会为“安全问题”进行尾递归优化(对此不太理解)
- 优化是随机发生的
因此,在C#4.0(Visual Studio 2013/2015)中,如何确保尾递归优化,如果可以确保它,该怎么做?
基于stackoverflow丰富的资源,我已经对是否专门针对c#代码进行尾递归优化得到了答案。其中一些问题似乎涉及以下几点:
因此,在C#4.0(Visual Studio 2013/2015)中,如何确保尾递归优化,如果可以确保它,该怎么做?
尾调用优化可以在不同的级别上得到支持。对于任何.NET程序,JIT都负责大部分优化工作。C#编译器本身甚至不会执行方法内联,这是JIT编译器的责任。C#编译器可以使用Tailcall IL操作码将调用指定为尾调用,但我认为没有任何版本的C#编译器这样做。只有64位JIT允许在其认为合适的情况下进行尾调用优化。特别地,我相信只有64位JIT才能这样做。这篇博客文章概述了许多情况下JIT64无法使用尾调用优化。我确信这些标准可能会因为他们正在重写JIT编译器(代号RyuJIT)而发生改变。
如果您想要一个可以使用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左右遇到堆栈溢出异常。