2013-06-13 12 views
17

In uno dei progetti della mia università sto lavorando direttamente con il bytecode Java.bytecode java - rappresentazione di tipi più piccoli di int

Dopo la navigazione in lista di istruzioni disponibili per la JVM (http://en.wikipedia.org/wiki/Java_bytecode_instruction_listings) ho visto che non esiste una cosa come [b|c|s]store, solo istore per la memorizzazione di numeri interi in una variabile locale. Vuol dire che se nel mio programma scrivo:

short a; 
int b; 

non sto salvando la memoria, perché ogni ingresso variabile locale occupa 4 byte?

Ho sempre avuto l'impressione che l'utilizzo dei tipi short o byte salverà un po 'di memoria in fase di esecuzione.

+2

Sembra corretto. Si ottengono comunque i risparmi usando 'byte []' s, comunque. –

risposta

13

Questo è spiegato nella sezione 2.11.1 of the JVMS:

Si noti che la maggior parte delle istruzioni [...] non hanno moduli per i tipi integrali byte, char, e short. Nessuno ha moduli per il tipo boolean. Un compilatore codifica un sacco di valori letterali dei tipi byte e short utilizzando le istruzioni Java Virtual Machine che firmano - estendono tali valori ai valori di tipo int in fase di compilazione o in fase di esecuzione. [...] Pertanto, la maggior parte delle operazioni sui valori dei tipi effettivi boolean, byte, char e short vengono eseguite correttamente mediante istruzioni che operano su valori di tipo computazionale int.

Si è giustificato così:

Dato un byte dimensione del codice operativo della macchina virtuale Java, i tipi di codifica in codici operativi pone pressione sul design del suo set di istruzioni. Se ogni istruzione digitata supportava tutti i tipi di dati di runtime della Java Virtual Machine, ci sarebbero più istruzioni di quante potrebbero essere rappresentate in un byte. Invece, il set di istruzioni della Java Virtual Machine fornisce un livello ridotto di supporto del tipo per determinate operazioni. In altre parole, l'insieme di istruzioni non è intenzionalmente ortogonale. È possibile utilizzare istruzioni separate per convertire tra tipi di dati non supportati e supportati, se necessario.

Tuttavia, mentre questo si applica al caricamento/memorizzazione di variabili di stack, non si applica al caricamento/salvataggio in matrici primitive; ci sono codici operativi per tutti i tipi primitivi.

3

Non si sta salvando alcuna memoria utilizzando un locale int rispetto a long poiché è probabile che si trovino nei registri a 64 bit. Nota: il modo in cui viene impostato il codice byte e come viene effettivamente eseguito il codice non è lo stesso.

Il salvataggio di due byte non è importante su nessun nuovo hardware. Il valore di 2 byte è inferiore a 1/1000 del tempo richiesto per lampeggiare anche se si è in regime di salario minimo.

+0

So che non salverò nessuna memoria significativa, ero solo curioso di questo caso. – Andna

+0

Anche se hai miliardi di risparmi da 2 byte, potrebbe essere più interessante ... Ma sono d'accordo, di solito non ha senso sprecare tempo a pensare a pochi byte sui sistemi moderni. – brimborium

+0

Sì, ma in un ambiente embedded, quei byte possono/si sommano, rendendo questo importante. – SnakeDoc

Problemi correlati