我什么时候应该(而且我不应该)使用Scala的@inline注释?

时间:2011-01-04 12:45:01

标签: scala inline

我相信我理解内联函数的基础知识:代替函数调用导致参数被放置在堆栈上并发生调用操作,函数的定义在编译时被复制到调用的位置,从而节省运行时的调用开销。

所以我想知道:

  • scalac是否使用智能内联某些功能(例如私有def)而没有注释提示?

  • 如何判断提示scalac内联函数何时是一个好主意?

  • 任何人都可以分享应该或不应该内联的函数或调用的示例吗?

2 个答案:

答案 0 :(得分:34)

从不@inline任何实施可能会合理改变的内容,以及 公共部分。

当我说“实施改变”时,我的意思是逻辑实际上可能会改变。例如:

object TradeComparator extends java.lang.Comparator[Trade] {
  @inline def compare(t1 : Trade, t2 : Trade) Int = t1.time compare t2.time
}

让我们说“自然比较”然后改为基于原子计数器。您可能会发现应用程序最终会有2个组件,每个组件都是根据不同版本的比较代码构建和内联的。

答案 1 :(得分:0)

就个人而言,我使用@ inline作别名:




  A类(param:Param){
 @inline def a = param.a
 def a2()= a * a
}
  




现在,我找不到办法知道它是否有任何作用(我试图jad生成的.class,但无法得出任何结论)。





我的目标是明确我希望编译器做什么。但是让它决定什么是最好的,或者干脆做它能做的事情。如果它不这样做,也许以后的编译器版本会。