所以I've read many times before从技术上说.NET确实支持尾部调用优化(TCO),因为它具有操作码,而C#不会生成它。
我不确定TCO为什么需要操作码或它会做什么。据我所知,能够执行TCO的要求是递归调用的结果不能与当前函数范围内的任何变量组合。如果没有,那么我看不到操作码如何阻止您保持堆栈框架打开。如果您确实有该功能,那么编译器难道不能总是轻松地将其编译为迭代的方式吗?
那么,操作码有什么意义呢?显然,我缺少一些东西。在完全可以使用TCO的情况下,难道不是总在编译器级别而不是在操作码级别处理它吗?哪里不行的例子是什么?
最佳答案
在您已经提供的链接之后,这对我来说似乎是一部分,可以非常紧密地回答您的问题。
Source
在许多情况下,我认为在您的问题中最有趣的部分是上面提到的示例安全性...
在许多情况下,.NET的安全性取决于堆栈的准确性...运行时为。 ..这就是为什么如上所述,负担由CIL编译器的源和(运行时)CIL-to共同负担的原因。本地JIT编译器,最终的决定权在于后者。
关于c# - 为什么尾部调用优化需要操作码?,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/27042917/