10

状态的文档@inline

方法上的注释,要求编译器应该特别努力地内联带注释的方法。

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

有什么方法可以确定编译器是否设法内联带注释的方法?

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

相关问题:

4

1 回答 1

6

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

考虑以下简单情况:

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-warningsEmit inlining warnings. (Normally surpressed due to high volume),所以我想它必须根据具体情况使用。

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

希望能有所帮助。

于 2013-01-15T01:18:11.173 回答