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

Когда я должен (а не должен ли я) использовать Scala аннотацию @inline?

Я считаю, что я понимаю основы встроенных функций: вместо вызова функции, приводящего к установке параметров в стек, и операции вызова, определение функции копируется во время компиляции туда, куда был сделан вызов, сохраняя накладные расходы вызова во время выполнения.

Итак, я хочу знать:

  • Использует ли scalac smarts для встраивания некоторых функций (например, private def) без подсказок из аннотаций?

  • Как я могу судить, когда неплохо было бы намекнуть на скаляс, что он строит функцию?

  • Может ли кто-нибудь поделиться примерами функций или вызовов, которые должны или не должны быть встроены?

4b9b3361

Ответ 1

Никогда @inline все, чья реализация может разумно измениться и которая станет частью публичной библиотеки.

Когда я говорю "изменение реализации", я имею в виду, что логика может измениться. Например:

object TradeComparator extends java.lang.Comparator[Trade] {
  @inline def compare(t1 : Trade, t2 : Trade) Int = t1.time compare t2.time
}

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

Ответ 2

Лично я использую @inline для псевдонима:

class A(param: Param){
  @inline def a = param.a
  def a2() = a * a
}

Теперь я не мог найти способ узнать, что он делает что-нибудь (я пытался обработать сгенерированный класс., но ничего не мог сделать).

Моя цель - указать, что я хочу сделать компилятору. Но пусть он решает, что лучше, или просто делать то, на что он способен. Если он этого не сделает, возможно, более поздняя версия компилятора будет.