从编译器请求有关@inline的更多信息?

时间:2013-01-14 18:29:43

标签: scala compiler-construction annotations inline scala-2.10

@inline州的文档:

  

请求编译器应特别努力内联注释方法的方法的注释。

但是,与类似的@tailrec注释不同,编译器不会(默认情况下)提供有关它是否设法内联方法的任何信息。

有没有办法确定编译器是否设法内联带注释的方法?

具体来说,我希望编译器告诉我,例如,在所有合理的情况下,它都能够内联我标记的方法。 (我可以想到一些情况,它会警告我它不能内联一个方法,如果它不是final,因此如果该类是子类,则需要vtable查找)

相关问题:

1 个答案:

答案 0 :(得分:6)

首先,您需要记住,当您使用-optimise(或我认为-Yinline)进行编译时,Scalac只会尝试内联。

考虑以下简单案例:

class Meep {
  @inline def f(x: Int) = x + 19
}

object Main extends App {
  new Meep().f(23)
}

如果我用-optimise编译它,Scalac会给我一个警告:there were 1 inliner warnings; re-run with -Yinline-warnings for details。现在,除了语法傻笑之外,这并没有给我太多帮助。

所以让我们用-Yinline-warnings重新编译。现在我得到:At the end of the day, could not inline @inline-marked method f。呃,好吧,这也不是很有帮助,但我想这就是我使用私有编译器标志所得到的。 :)顺便提一下,一些内联警告更有帮助 - 比如:Could not inline required method f because bytecode unavailable.(在REPL中发生)

编译器帮助将-Yinline-warnings解释为Emit inlining warnings. (Normally surpressed due to high volume),因此我猜它必须根据具体情况使用。

无论如何,如果我们将上述代码段中f的定义更改为@inline final def f(x: Int) = x + 19,内联警告将会消失,并且该方法将正确内联。

希望有所帮助。