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

Gra*_*Lea 39 scala inline

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

所以我想知道:

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

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

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

oxb*_*kes 35

从来没有@inline任何实施可能合理改变的东西,哪些将成为图书馆公共部分.

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

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

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

  • 当不使用它时,这是一个非常好的答案.当你应该使用它时,是否有一些guildelines?我应该开始将它放在除公共API函数之外的任何地方吗?或scalac + JVM足够智能,我几乎不需要把它放在任何地方? (11认同)