Когда я должен (а не должен ли я) использовать Scala аннотацию @inline?
Я считаю, что я понимаю основы встроенных функций: вместо вызова функции, приводящего к установке параметров в стек, и операции вызова, определение функции копируется во время компиляции туда, куда был сделан вызов, сохраняя накладные расходы вызова во время выполнения.
Итак, я хочу знать:
-
Использует ли scalac smarts для встраивания некоторых функций (например, private def) без подсказок из аннотаций?
-
Как я могу судить, когда неплохо было бы намекнуть на скаляс, что он строит функцию?
-
Может ли кто-нибудь поделиться примерами функций или вызовов, которые должны или не должны быть встроены?
Ответы
Ответ 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
}
Теперь я не мог найти способ узнать, что он делает что-нибудь (я пытался обработать сгенерированный класс., но ничего не мог сделать).
Моя цель - указать, что я хочу сделать компилятору. Но пусть он решает, что лучше, или просто делать то, на что он способен. Если он этого не сделает, возможно, более поздняя версия компилятора будет.