【问题标题】:When should I (and should I not) use Scala's @inline annotation?我什么时候应该(也不应该)使用 Scala 的 @inline 注释?
【发布时间】:2011-06-03 09:12:09
【问题描述】:

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

所以我想知道:

  • scalac 是否在没有注释提示的情况下使用 smarts 来内联某些函数(例如私有 def)?

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

  • 谁能分享应该或不应该内联的函数或调用示例?

【问题讨论】:

标签: scala inline


【解决方案1】:

永远不要@inline 任何实现可能会合理更改并且将成为公共部分的东西。

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

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

假设“自然比较”随后更改为基于原子计数器。您可能会发现一个应用程序最终包含 2 个组件,每个组件都针对不同版本的比较代码构建和内联。

【讨论】:

  • 当不使用它时,这是一个很好的答案。什么时候应该使用它有一些指导方针吗?除了公共 API 函数,我应该开始将它放在任何地方吗?还是 scalac+JVM 足够聪明,我几乎不需要把它放在任何地方?
  • 接受这个作为何时避免@inline 的好答案。这个问题解释了为什么它可能根本没有多大用处:stackoverflow.com/questions/2709095/…
【解决方案2】:

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

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

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

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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2012-09-22
    • 1970-01-01
    • 1970-01-01
    • 2010-12-30
    • 1970-01-01
    • 2015-05-19
    相关资源
    最近更新 更多