instrucciones JVM - Sload

Noskol:

Supongo que es una cuestión básica, pero ¿por qué no hay Sload instrucción? ¿Por qué se puede cargar todas las primitivas además corta? (Hay saload , pero aún así ...)

Por :

public class ShortTest {
    public void test() {
        short i = 1;
        System.out.print(i);
    }
}

Compilador sigue utilizando iload_1 . ¿Es porque es corta Tipo de procesadores de 16 bits y de 32 bits manejar mejor (ya que todos los procesadores modernos son de 32 / 64bits)?

Holger:

Consulte la especificación de JVM, §2.11.1. Tipos y la Máquina Virtual de Java :

Tenga en cuenta que la mayoría de las instrucciones que aparecen en la tabla 2.11.1-A no tienen formularios para los tipos integrales byte, chary short. Ninguno tiene formas para el booleantipo. Un compilador codifica un montón de valores literales de tipos bytey shortel uso de Java Virtual Machine instrucciones de inicio de sesión que se extiende esos valores a valores de tipo inten tiempo de compilación o en tiempo de ejecución. Las cargas de valores literales de tipos booleany charse codifican utilizando instrucciones que cero se extienden el literal a un valor de tipo inten tiempo de compilación o de tiempo de ejecución. Del mismo modo, las cargas de las matrices de valores de tipo boolean, byte, short, y charson codificadas utilizando las instrucciones Java Virtual Machine que el inicio de sesión se extienden o cero extender los valores para valores de tipoint. Por lo tanto, la mayoría de las operaciones en valores de tipos reales boolean, byte, char, y shortse llevan a cabo correctamente por las instrucciones de funcionamiento en valores de tipo computacional int.

Vale la pena recordar que en Java, cualquier aritmética de enteros que no impliquen longtendrá un intresultado, independientemente de si la entrada es byte, char, short, o int.

Así que una línea como

short i = 1, j = 2, k = i + j;

no se compilará, pero requieren un molde tipo, como

short i = 1, j = 2, k = (short)(i + j);

Y este tipo fundido será el único indicador que shortestá involucrado. Dejando a un lado consejos de depuración, no hay ninguna declaración formal de variables locales en el código de bytes, pero sólo asignaciones de valores que determinan su tipo. Así que las variables locales de tipo shortsimplemente no existen. El código anterior se compila a

     0: iconst_1
     1: istore_1
     2: iconst_2
     3: istore_2
     4: iload_1
     5: iload_2
     6: iadd
     7: i2s
     8: istore_3

que es idéntica a la forma compilada de

int i = 1, j = 2, k = (short)(i + j);

Pero cuenta que el tipo en tiempo de compilación de las variables puede cambiar el método que el compilador elige para una invocación en caso de sobrecargas. Lo cual es especialmente importante si los tipos llevan una semántica diferente, al igual que en el caso de print(boolean)o print(char). Mientras que el valor pasado al método tiene un inttipo en cualquiera de los casos, el resultado es completamente diferente.

Otro ejemplo de las diferencias impuesta por el compilador es

{
    int i = 1;
    i++;
}
{
    short s = 1;
    s++;
}

el cual se compila a

     0: iconst_1
     1: istore_1
     2: iinc          1, 1
     5: iconst_1
     6: istore_1
     7: iload_1
     8: iconst_1
     9: iadd
    10: i2s
    11: istore_1

Por lo tanto, ya que el cálculo se realiza siempre en 32 bits, el compilador inserta el código necesario para truncar el resultado que shortpara el segundo incremento. Nota de nuevo la ausencia de declaraciones de variables, por lo que el código es idéntico a la forma compilada de

int i = 1;
i++;
i = 1;
i = (short)(i+1);

También vale la pena mirar el Sistema Tipo de verificación , ya que el verificador comprobará la validez de todas las transferencias desde y hacia las variables locales:

El tipo de corrector hace cumplir un sistema de tipo basado en una jerarquía de verificación tipos, se ilustra a continuación.

Verification type hierarchy:

                             top
                 ____________/\____________
                /                          \
               /                            \
            oneWord                       twoWord
           /   |   \                     /       \
          /    |    \                   /         \
        int  float  reference        long        double
                     /     \
                    /       \_____________
                   /                      \
                  /                        \
           uninitialized                    +------------------+
            /         \                     |  Java reference  |
           /           \                    |  type hierarchy  |
uninitializedThis  uninitialized(Offset)    +------------------+  
                                                     |
                                                     |
                                                    null

Por lo que el sistema de tipos se simplifica, en comparación con los tipos de lenguaje Java, y el verificador no le importa, por ejemplo, si se pasa un booleanvalor a un método esperando una char, ya que ambos son inttipos.

Supongo que te gusta

Origin http://43.154.161.224:23101/article/api/json?id=314586&siteId=1
Recomendado
Clasificación