Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/perl/11.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 表达式.Lambda中的Tailcall参数_C#_Generics_C# 4.0_Lambda_Expression Trees - Fatal编程技术网

C# 表达式.Lambda中的Tailcall参数

C# 表达式.Lambda中的Tailcall参数,c#,generics,c#-4.0,lambda,expression-trees,C#,Generics,C# 4.0,Lambda,Expression Trees,在中为tailcall优化提供参数的原因是什么 Expression.Lambda(Expression body,bool tailcall, IEnumerable<ParameterExpression> Parameters) Expression.Lambda(表达式体,bool tailcall, IEnumerable参数) 只要它不影响结果,为什么我们要明确地为它指定一个值。我觉得进行tailcall优化总是更好的。你对此有不同的想法吗?这个设计很有趣 为tail

在中为tailcall优化提供参数的原因是什么

Expression.Lambda(Expression body,bool tailcall,
IEnumerable<ParameterExpression> Parameters)
Expression.Lambda(表达式体,bool tailcall,
IEnumerable参数)

只要它不影响结果,为什么我们要明确地为它指定一个值。我觉得进行tailcall优化总是更好的。你对此有不同的想法吗?这个设计很有趣

tailcall
参数传递
true
,将尝试在尾位置调用方法,作为lambda主体内的尾调用

尾部位置是方法调用返回表达式的位置

至于更好,那是主观的

  • 尾声总是比较慢
  • 需要遵循某些规则(返回类型必须匹配或是引用)
  • 您没有用于调试的堆栈跟踪

Ashley:如果没有完整的堆栈跟踪,调试可能会非常困难!你能解释一下为什么它会变慢吗?这是实现中的一个.net问题吗?考虑到尾部调用只是执行“goto”而不是函数调用,它应该更快,因为它不必在堆栈上推送一大堆数据。这意味着它节省了将数据放入内存的时间,但也在本地缓存中保留了相同的堆栈内存区域,从而节省了一些缓存未命中。@CKoenig:在CLR 2 it上,方法调用开销大约是正常调用的7倍。这是从基准测试和开发需要适当尾部递归的语言(IronScheme)的个人经验中发现的。@Gabe:您所指的是尾部调用消除(TCE),其中尾部调用转换为
,而(true){…}
循环。这是一种非常常见的存在尾部调用的优化。@Ashley John:在调用方法之前,尾部调用会弹出堆栈。这就是为什么不能通过适当的尾部递归获得stackoverflow异常。