2013-01-14 13 views
10

La documentazione per @inline stati:Richiesta di ulteriori informazioni su @inline dal compilatore?

Un'annotazione su metodi che richiede che il compilatore dovrebbe cercare particolarmente difficile da inline il metodo annotato.

Tuttavia, a differenza del simile @tailrec annotazione, il compilatore non (per impostazione predefinita) offrono tutte le informazioni su se o non è riuscito a inline un metodo.

C'è un modo per determinare se il compilatore è riuscito a incorporare un metodo annotato?

In particolare, vorrei che il compilatore mi dicesse, ad esempio, che in tutti i casi ragionevoli sarà in grado di allineare un metodo che ho contrassegnato. (Alcune situazioni specifiche che posso pensare a dove mi mette in guardia che non può inline un metodo è se non è final, e quindi richiede una ricerca vtable se la classe è una sottoclasse)

Domande correlate:

+0

Immagino che la compilazione con '-Yinline-warnings' non è quello che stai cercando? –

+0

Forse, perché non aggiungere una risposta che spiega cosa fa '-Yinline-warnings'? –

risposta

6

In primo luogo, è necessario ricordare che scalac solo tenterà di inline cose quando si compila con -optimise (o -Yinline I pensare).

Si consideri il seguente caso semplice:

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

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

Se compilo che con -optimise, scalac volontà mi dà un avvertimento: there were 1 inliner warnings; re-run with -Yinline-warnings for details. Ora, a parte la risatina della grammatica, questo non mi ha dato molto.

Quindi ricompiliamo con -Yinline-warnings. Ora ottengo: At the end of the day, could not inline @inline-marked method f. Uh, OK, non è stato di grande aiuto, ma immagino sia quello che ottengo usando un flag di compilatore privato. :) Alcune delle avvertenze in linea sono un pochino più utili, tra l'altro - come: Could not inline required method f because bytecode unavailable. (il che accade nel REPL)

compilatore della Guida spiega come -Yinline-warningsEmit inlining warnings. (Normally surpressed due to high volume), quindi credo che deve essere utilizzato su un caso per caso.

Ad ogni modo, se cambiamo la definizione di f nello snippet sopra a @inline final def f(x: Int) = x + 19, l'avviso in linea sparirà e il metodo sarà correttamente inserito.

Spero che questo abbia aiutato un po '.

+0

Perfetto, questo è esattamente quello che stavo cercando. Ti capita di conoscere un riferimento completo a TUTTE le opzioni del compilatore Scala? –

+3

Nella shell è possibile ottenere informazioni su tutte le opzioni supportate con 'scalac -help', le opzioni avanzate con' scalac -X' e le opzioni "private" con 'scalac -Y'. –

+0

Heh, sono imbarazzato nel dire che non lo sapevo. Suppongo che sia quello che ottengo principalmente usando un IDE per tutte le mie attività scala, inclusa la compilazione. –

Problemi correlati