2013-01-14 10 views
10

Dokumentacja @inline stanów:Czy chcesz uzyskać więcej informacji o @inline z kompilatora?

Adnotacja na metodach, które wnosi kompilator powinien spróbować szczególnie trudne do inline z uwagami metody.

Jednak w przeciwieństwie do podobnej adnotacji @tailrec, kompilator (domyślnie) nie oferuje żadnych informacji o tym, czy udało mu się zainicjować metodę.

Czy istnieje sposób sprawdzenia, czy kompilator zdołał wstawić metodę z adnotacjami?

W szczególności, chciałbym, aby kompilator powiedział mi, na przykład, że we wszystkich uzasadnionych przypadkach będzie w stanie wstawić zaznaczoną przeze mnie metodę. (Niektóre situtations mogę myśleć gdzie byłoby mnie ostrzec, że nie może inline metoda jest czy nie jest final, a zatem wymaga vtable odnośnika jeśli klasa jest podklasy)

Podobne pytania:

+0

Domyślam się, że kompilacja z '-Yinline-ostrzeżenia' nie jest tym, czego szukasz? –

+0

Być może, dlaczego nie dodasz odpowiedzi wyjaśniającej, co robi "-lininowe ostrzeżenia"? –

Odpowiedz

6

po pierwsze, trzeba pamiętać, że Scalac postara tylko inline rzeczy podczas kompilowania z -optimise (lub -Yinline i myśleć).

Rozważmy następujący przypadek: prosty

class Meep { 
    @inline def f(x: Int) = x + 19 
} 

object Main extends App { 
    new Meep().f(23) 
} 

Gdybym skompilować że z -optimise, Scalac wola daje mi ostrzeżenie: there were 1 inliner warnings; re-run with -Yinline-warnings for details. Teraz, oprócz chichotu gramatyki, niewiele mi to dało.

Rekompilujmy teraz z -Yinline-warnings. Teraz otrzymuję: At the end of the day, could not inline @inline-marked method f. Uh, OK, to też nie było zbyt pomocne, ale sądzę, że właśnie to uzyskuję, używając flagi prywatnego kompilatora. :) Niektóre ostrzeżenia inline są odrobinę bardziej pomocny, tak przy okazji - jak: Could not inline required method f because bytecode unavailable. (co zdarza się w REPL)

Pomoc kompilator tłumaczy -Yinline-warnings jak Emit inlining warnings. (Normally surpressed due to high volume), więc myślę, że musi być stosowany na indywidualnie dla każdego przypadku.

W każdym razie, jeśli zmienimy definicję f w powyższym fragmencie kodu na @inline final def f(x: Int) = x + 19, ostrzeżenie zostanie usunięte, a metoda będzie poprawnie wstawiona.

Mam nadzieję, że trochę pomogłem.

+0

Doskonały, dokładnie tego właśnie szukałem. Czy znasz pełne odwołanie do WSZYSTKICH opcji kompilatora scala? –

+3

W powłoce możesz uzyskać informacje o wszystkich obsługiwanych opcjach za pomocą 'skalac -help', zaawansowanych opcji z' skalac -X' i "prywatnych" opcji z 'skalac -Y". –

+0

Heh, jestem zażenowany, mówiąc, że tego nie wiedziałem. Przypuszczam, że to jest to, co otrzymuję głównie za pomocą IDE dla wszystkich moich zadań scala, w tym kompilacji. –