Tag: 尾调用优化

为什么尾调用优化需要操作码?

所以我之前已经阅读了很多次 ,技术上.NET 确实支持尾调用优化(TCO),因为它有操作码,只有C#不生成它。 我不确定为什么TCO需要操作码或它会做什么。 据我所知,能够进行TCO的要求是递归调用的结果不与当前函数范围中的任何变量组合。 如果你没有那个,那么我没有看到操作码如何阻止你必须保持堆栈框架打开。 如果你有,那么编译器是否总能轻易地将其编译为迭代的东西? 那么操作码有什么意义呢? 显然有些东西我不见了。 在完全可以使用TCO的情况下,不能总是在编译器级别处理,而不是在操作码级别处理? 什么是不能的例子?

是否存在技术原因,C#不发出“尾部。”CIL指令?

可能重复: 为什么.net / C#没有消除尾递归? 请使用以下C#代码: using System; namespace TailTest { class MainClass { public static void Main (string[] args) { Counter(0); } static void Counter(int i) { Console.WriteLine(i); if (i < int.MaxValue) Counter(++i); } } } C#编译器(无论如何)都会将Counter方法编译成以下CIL: .method private static hidebysig default void Counter (int32 i) cil managed { .maxstack 8 IL_0000: ldarg.0 IL_0001: call […]