2012-01-13 8 views
5

Sto cercando di decidere come progettare la mia app.Android: ci vogliono davvero 2 byte?

Ho circa 300 istanze della classe proprio come questo:

public class ParamValue { 

    protected String sValue = null; 
    protected short shValue = 0; 
    protected short mode = PARAM_VALUE_MODE_UNKNOWN; 

    /* 
    * ... 
    */ 
} 

ho un array di questi casi. Non riesco a scoprire che questi cortometraggi prendono davvero 2 byte o prendono comunque 4 byte?

E ho bisogno di passare l'elenco di questi oggetti tramite AIDL come List<Parcelable>. Il pacco non può readShort() e writeShort(), può funzionare solo con int. Quindi, per usare l'abbreviazione anche qui, devo confezionare manualmente due miei pantaloncini in un solo int, pacchettizzarlo e poi disfarlo. Sembra troppo invadente.

Potrebbe dirmi quanti pantaloncini di byte sono necessari, e ha senso utilizzare short anziché int qui?

UPDATE:

Ho aggiornato la mia domanda per i lettori futuri.

Così, ho scritto un'app di test e ho capito che nel mio caso non c'è assolutamente alcun motivo per usare short, perché occupa lo stesso spazio di int. Ma se definisco serie di bicchierini genere:

protected short[] myValues[2]; 

quindi richiede meno spazio rispetto array di int:

protected int[] myValues[2]; 

risposta

5

Tecnicamente, in linguaggio Java, uno short è 2 byte. All'interno della JVM, tuttavia, short è un tipo di memoria , non è un tipo di dati primitivi a pieno titolo come , float o double. I registri JVM tengono sempre 4 byte alla volta; non ci sono registri half-word o byte. Se la JVM archivia effettivamente uno short in due byte all'interno di un oggetto o se è sempre memorizzato come 4 byte, è davvero all'altezza dell'implementazione.

Questo vale per una JVM "reale". Dalvik fa le cose diversamente? Boh.

+0

quindi, sembra che non ci sia alcun motivo per usare short se cerco di ottenere un minor utilizzo della memoria? –

+1

Scriverò un programma di test che crea un numero elevato di oggetti e misura la memoria libera prima e dopo con 'Runtime.freeMemory()' ed eseguirlo sulla JVM di produzione effettiva. Fai questo per entrambi i modi di definire l'oggetto e vedi se riesci a rilevare una differenza. Ci può o non può essere una differenza, ma questo ti permetterà di vedere di sicuro. –

+0

Non penso che dipenda dall'implementazione, almeno nel caso degli array, se supporterà JNI. –

1

Secondo la Java Virtual Machine Specification, Sec. 2.4.1, un short è sempre esattamente due byte.

Java Native Interface consente l'accesso diretto dal codice nativo agli array di primitivi memorizzati nella VM. Una cosa simile può succedere in Android's JNI. Questo praticamente garantisce che un Java short[] sarà un array di valori a 2 byte in un ambiente compatibile con JVM o in una macchina virtuale Dalvik.

+0

ma, nel mio caso, c'è una matrice di istanze di classe contenente due cortocircuiti, non una matrice come 'breve []'. Beh, ho davvero bisogno di provarlo. E grazie per i link, lo esaminerò. –