Запрос дополнительной информации о @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
, встроенное предупреждение исчезнет, и метод будет правильно встроен.
надеюсь, что помог немного.