C#编译与尾递归优化?

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

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

从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(或不喜欢32位的AnyCPU)并在没有附加调试器的情况下启动。 该计划将永远运行。 如果我不做所有这些事情,那么我会在20947左右得到一个stackoverflowexception。