Когда я должен (и не должен) использовать аннотацию Scala @inline? - PullRequest
39 голосов
/ 04 января 2011

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

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

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

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

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

Ответы [ 2 ]

35 голосов
/ 04 января 2011

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

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

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

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

0 голосов
/ 23 ноября 2016

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

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

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

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

...