Pregunta

int i = 10 + 20;

¿Es cierto que el compilador procesar este código, añadiendo 10 + 20, y el código de bytes es el mismo que para esta línea de código?

int i = 30;

¿Dónde puedo leer sobre él?

¿Fue útil?

Solución

Sí, e incluso se puede verificar por sí mismo. Tome un pequeño archivo de Java, por ejemplo:

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

Compilar con javac Main.java, y luego ejecutar javap -c Main desmontarlo:

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

}

Es evidente que en el código de bytes, se puede ver la optimización del compilador: bipush 30

Otros consejos

Sí. Esta optimización del compilador se llama plegado . Hay otra optimización del compilador llamada escasa condicional constante propagación, que hace algo similar.

En general, no hay ninguna garantía de que un compilador dado realmente doblar constantes, pero hoy en día casi todos los compilador para todos los idiomas hace esto. En particular, el Especificación del lenguaje Java requiere que expresiones constantes ser evaluados en tiempo de compilación.

Sí, se simplificará como lo requiere los JLS (gracias a @EJP para esta precisión).

Si desea más recursos y optimización javac usted debe echar un vistazo a Las optimizaciones del compilador o de Java compiladores .

Otra cosa interesante es que incluso si el código está optimizado durante la compilación, un segundo optimización se llevará a cabo durante el tiempo de ejecución con punto de acceso .


Recursos:

Sobre el mismo tema:

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top