C#,尽管尾部调用优化对于高效递归函数有好处,但目前不支持它。
挑战在于执行速度和代码优化复杂性之间的权衡。 即时 (JIT) 编译优先考虑快速编译而不是大量代码分析。尽管公共语言运行时 (CLR) 可以 支持尾部调用优化,但 C# 编译器不会生成必要的操作码。
考虑这个例子:
<code class="language-csharp">private static void Foo(int i) { if (i == 1000000) return; if (i % 100 == 0) Console.WriteLine(i); Foo(i+1); }</code>
即使 Visual Studio 2008 也未能将这个递归函数优化为循环,这说明了编译器分析的局限性。
像 F# 这样的语言已经实现了必要的编译器扩展来生成适当的操作码以进行尾部调用优化。 这表明 C# 的未来版本可能会包含此功能。然而,原生图像生成器 (NGen) 编译的保守性仍然是一个潜在的障碍,因为它优先考虑避免性能回归。
要更深入地了解此主题,请参阅参考的博客文章。 它提供了 4.0 版本中与尾部调用优化及其架构依赖项相关的 CLR 更改的详细信息。
以上是为什么 C# 不优化尾调用递归?的详细内容。更多信息请关注PHP中文网其他相关文章!