Запрос дополнительной информации о @inline от компилятора?

документация @inline гласит:

аннотация о методах, которая запрашивает, чтобы компилятор особенно старался встроить аннотированный метод.

однако, в отличие от аналогичных @tailrec аннотация, компилятор (по умолчанию) не предоставляет никакой информации о том, удалось ли ему встроить метод.

есть ли способ определить, удалось ли компилятору встроенный аннотированный метод?

в частности, я хотел бы, чтобы компилятор сказал мне, например, что во всех разумных случаях он сможет встроить метод, который я отметил. (Некоторые situtations я могу думать о том, где он предупредил бы меня, что он не может встроить метод, если это не final, и, следовательно, требует поиска vtable, если класс подклассов)

вопросы:

1 ответов


во-первых, вам нужно помнить, что Scalac будет пытаться встроить вещи только при компиляции с -optimise (или -Yinline Я думаю).

рассмотрим следующий простой пример:

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

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

если я скомпилирую это с -optimise, Скалак даст мне предупреждение: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 as Emit inlining warnings. (Normally surpressed due to high volume), поэтому я думаю, что он должен использоваться в каждом конкретном случае.

в любом случае, если мы изменим определение f в приведенном выше фрагменте в @inline final def f(x: Int) = x + 19, встроенное предупреждение исчезнет, и метод будет правильно встроен.

надеюсь, что помог немного.