2012-01-13 14 views
5

Estoy tratando de tomar una decisión sobre cómo diseñar mi aplicación.Android: ¿toma poco realmente 2 bytes?

Tengo alrededor de 300 instancias de la clase como ésta:

public class ParamValue { 

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

    /* 
    * ... 
    */ 
} 

que tengo una gran variedad de estos casos. No puedo averiguar ¿estos cortos realmente toman 2 bytes o toman de todos modos 4 bytes?

Y necesito pasar la lista de estos objetos a través de AIDL como List<Parcelable>. El paquete no puede readShort() y writeShort(), solo puede funcionar con int. Por lo tanto, para usar brevemente aquí también tengo que empacar manualmente dos mis pantalones cortos en un int, parcela y luego desempaquetar. Se ve demasiado molesto.

¿Podría decirme cuántos bytes cortos toma, y ​​tiene sentido usar el método abreviado en lugar de int aquí?

ACTUALIZACIÓN:

He actualizado mi pregunta para los futuros lectores.

Entonces, escribí una aplicación de prueba y descubrí que en mi caso no hay absolutamente ninguna razón para usar short, porque ocupa el mismo espacio que int. Pero si defino serie de cortometrajes como que:

protected short[] myValues[2]; 

entonces se necesitan menos espacio que matriz de INT:

protected int[] myValues[2]; 

Respuesta

5

Técnicamente, en el lenguaje Java, un short tiene 2 bytes. Sin embargo, dentro de la JVM, short es un tipo de almacenamiento , no es un tipo de datos primitivos en toda regla, como int, float, o double. Los registros JVM siempre tienen 4 bytes a la vez; no hay registros de media palabra o byte. Si la JVM alguna vez almacena un short en dos bytes dentro de un objeto, o si siempre se almacena como 4 bytes, realmente depende de la implementación.

Todo esto es válido para una JVM "real". ¿Dalvik hace las cosas de manera diferente? No sé.

+0

entonces, parece que no hay ninguna razón para usar el short si intento lograr menos uso de memoria? –

+1

Escribo un programa de prueba que crea una gran cantidad de objetos y mide la memoria libre antes y después con 'Runtime.freeMemory()' y lo ejecuta en la JVM de producción real. Haga esto para ambas formas de definir el objeto y vea si puede detectar una diferencia. Puede o no haber una diferencia, pero esto te permitirá ver con certeza. –

+0

No creo que sea la implementación, al menos en el caso de las matrices, si va a admitir JNI. –

1

De acuerdo con la Java Virtual Machine Specification, Sec. 2.4.1, un short es siempre exactamente dos bytes.

El Java Native Interface permite el acceso directo desde el código nativo a las matrices de las primitivas almacenadas en la máquina virtual. Algo similar puede suceder en Android's JNI. Esto garantiza que un Java short[] será una matriz de valores de 2 bytes en un entorno compatible con JVM o en una máquina virtual Dalvik.

+0

pero, en mi caso, hay una serie de instancias de clase que contienen dos cortometrajes, no una matriz como 'short []'. Bueno, realmente necesito probarlo. Y gracias por los enlaces, lo examinaré. –

Cuestiones relacionadas