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

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

所以我想知道:

  • scalac是否使用智能来内联一些函数(例如,私有def)而没有注释的提示?

  • 我该如何判断什么时候向scalac暗示它是函数的一个好主意呢?

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

永远不要@inline任何实施可能会有所改变,哪些将成为图书馆公共部分。

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

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

比方说,“自然比较”然后改变为基于primefaces计数器。 您可能会发现应用程序最终有两个组件,每个组件都针对不同版本的比较代码构build和内联。

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

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

现在,我无法find一个方法来知道它是否做了什么(我试图jad生成的.class,但不能得出任何结论)。

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