Domanda

int i = 10 + 20;

E 'vero che il compilatore elaborerà questo codice, aggiungendo 10 + 20, e il codice byte è lo stesso che per questa riga di codice?

int i = 30;

Dove posso leggere in proposito?

È stato utile?

Soluzione

Sì, e si può anche verificare in prima persona. Prendete un piccolo file Java, ad esempio:

public class Main {
  public Main() {
    int i = 10 + 20;
  }
}

compilarlo con javac Main.java, e javap -c Main poi correre a smontarlo:

Compiled from "Main.java"
public class Main extends java.lang.Object{
public Main();
  Code:
   0:   aload_0
   1:   invokespecial   #1; //Method java/lang/Object."<init>":()V
   4:   bipush  30
   6:   istore_1
   7:   return

}

Chiaramente nel bytecode, si può vedere l'ottimizzazione del compilatore:! bipush 30

Altri suggerimenti

Sì. Questa ottimizzazione del compilatore è chiamato ripiegamento costante . C'è un altro ottimizzazione del compilatore chiamato sparse condizionale costante di propagazione che fa qualcosa di simile.

In generale, non c'è alcuna garanzia che un dato compilatore effettivamente piega costanti, ma al giorno d'oggi quasi tutti compilatore per ogni lingua fa questo. In particolare, il Java Language Specification richiede che espressioni costanti essere valutate in fase di compilazione.

Si, sarà semplificato come richiesto dalla i JLS (grazie a @EJP per questa precisione).

Se volete più risorse e l'ottimizzazione javac si dovrebbe dare un'occhiata a ottimizzazioni del compilatore o Java compilatori .

Un'altra cosa interessante è che, anche se il codice è ottimizzato durante la compilazione, un secondo di ottimizzazione sarà fatto durante il runtime con hotspot .


Risorse:

Sullo stesso argomento:

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top