¿Por qué la JVM tiene los códigos de operación iconst_2 - iconst_5?

Mientras leía la especificación JVM (como uno lo hace), me sorprendió mucho cuando encontré los 7 iconst_<i>códigos de operación. Después de todo, solo hay un byte para jugar.

Muy rara vez escribo los literales para 2, 3, 4 o 5 en mi código. Puedo entender por qué -1, 0 y 1 podrían ser tratados especialmente, pero me parece sorprendente que los diseñadores quieran soplar 4 preciosos códigos de operación en números que resultan ser bastante pequeños.

¿Alguien sabe si hay una buena razón para esto? ¿Estoy subestimando el beneficio de estos?

Respuesta 1

Creo que su suposición es correcta: solo para hacer que el bytecode sea más pequeño y el intérprete de Java sea un poco más rápido (no había compilador JIT en esos momentos). Tenga en cuenta que estos códigos de byte se pueden usar con mucha más frecuencia de la que espera. Por ejemplo, considere el siguiente código:

int[] a = {10, 20, 30, 40};

Efectivamente se compila a algo como:

int[] a = new int[4];
a[0] = 10;
a[1] = 20;
a[2] = 30;
a[3] = 40;

Así que aquí iconst_0que iconst_4se utilizan a pesar de que no tienen esas constantes en el código fuente.

Respuesta: 2

Estoy tratando de entender los sombreadores que usan libgdx, provenientes de un fondo XNA / HLSL. Estoy tratando de obtener un par de sombreadores vert / frag para reproducir la salida que obtengo sin un sombreador, pero no se muestra ...

Tengo un problema para reproducir más de un archivo mp3 con MediaPlayer en Android. Puedo reproducir un solo archivo, pero no encontré nada útil para reproducir diferentes archivos uno después de ...

Estoy tratando de hacer una aplicación con función nfc. el problema es cuando se descubre la etiqueta nfc, la intención pendiente siempre crea una nueva actividad que ya existe. Estoy usando la pestaña host. cómo hacer pendiente pendiente sin ...

Estoy haciendo un juego simple de igual a igual y decidí usar XML para enviar información a través de sockets (ejemplo a continuación). ¿Pero no estoy seguro de cómo enviarlo? Simplemente debería usar ObjectOutputStream.writeObject (obj) ...