【问题标题】:Requesting more information about @inline from the compiler?向编译器请求有关@inline 的更多信息?
【发布时间】:2012-12-28 18:15:37
【问题描述】:

@inline 的文档指出:

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

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

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

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

相关问题:

【问题讨论】:

  • 我猜用-Yinline-warnings 编译不是你要找的?
  • 可能,你为什么不添加一个答案来解释-Yinline-warnings 的作用?

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


【解决方案1】:

首先,您需要记住,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-warnings解释为Emit inlining warnings. (Normally surpressed due to high volume),所以我想它必须根据具体情况使用。

无论如何,如果我们把上面sn-p中f的定义改成@inline final def f(x: Int) = x + 19,内联警告就会消失,方法会被正确内联。

希望能有所帮助。

【讨论】:

  • 完美,这正是我想要的。您是否碰巧知道对所有 scala 编译器选项的完整参考?
  • 在 shell 中,您可以使用 scalac -help 获取有关所有受支持选项的信息,使用 scalac -X 获取高级选项以及使用 scalac -Y 获取“私有”选项的信息。
  • 呵呵,不好意思说我不知道​​。我想这就是我主要将 IDE 用于所有 scala 任务(包括编译)的结果。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2018-06-11
  • 1970-01-01
  • 2017-11-23
  • 1970-01-01
相关资源
最近更新 更多