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

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

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

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

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

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

Связанные вопросы:


person Alex DiCarlo    schedule 14.01.2013    source источник
comment
Я думаю, компиляция с -Yinline-warnings - это не то, что вам нужно?   -  person    schedule 15.01.2013
comment
Возможно, почему бы вам не добавить ответ, объясняющий, что делает -Yinline-warnings?   -  person Alex DiCarlo    schedule 15.01.2013


Ответы (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), поэтому я думаю, что его нужно использовать в каждом конкретном случае.

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

Надеюсь, это немного помогло.

person Community    schedule 15.01.2013
comment
Идеально, это именно то, что я искал. Вы случайно не знаете полную ссылку на ВСЕ параметры компилятора scala? - person Alex DiCarlo; 15.01.2013
comment
В оболочке вы можете получить информацию обо всех поддерживаемых параметрах с помощью scalac -help, расширенных параметрах с помощью scalac -X и частных параметрах с помощью scalac -Y. - person ; 15.01.2013
comment
Хех, мне стыдно сказать, что я этого не знал. Я полагаю, что это то, что я получаю в основном за использование IDE для всех моих задач scala, включая компиляцию. - person Alex DiCarlo; 15.01.2013