10

@inline州のドキュメント:

コンパイラーが注釈付きメソッドをインライン化するために特に一生懸命努力する必要があることを要求するメソッドの注釈。

ただし、同様の@tailrecアノテーションとは異なり、コンパイラーは(デフォルトで)メソッドをインライン化できたかどうかに関する情報を提供しません。

コンパイラが注釈付きメソッドをインライン化できたかどうかを判断する方法はありますか?

具体的には、たとえば、すべての合理的なケースで、マークしたメソッドをインライン化できることをコンパイラーに通知してもらいたいと思います。(メソッドをインライン化できないという警告が表示される状況は、そうでない場合であるfinalため、クラスがサブクラス化されている場合はvtableルックアップが必要になります)

関連する質問:

4

1 に答える 1

6

-optimiseまず、Scalacは(または-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)ので、ケースバイケースで使用する必要があると思います。

fとにかく、上記のスニペットの定義をに変更する@inline final def f(x: Int) = x + 19と、インライン警告が消え、メソッドが適切にインライン化されます。

それが少し役に立ったことを願っています。

于 2013-01-15T01:18:11.173 に答える