Подтвердить что ты не робот

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

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

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

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

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

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

Похожие вопросы:

4b9b3361

Ответ 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, встроенное предупреждение исчезнет, ​​и метод будет правильно вложен.

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