2012-01-13 89 views
5

我想做出决定如何设计我的应用程序。Android:真的需要2个字节吗?

我一样有这个类的约300实例:

public class ParamValue { 

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

    /* 
    * ... 
    */ 
} 

我的这些实例的数组。我无法找到这些短裤真的需要2个字节,否则他们拿4个字节?

而且我需要通过AIDL传递这些对象的列表作为List<Parcelable>。包裹不能readShort()writeShort(),它只能与int一起使用。所以,为了在这里使用short,我必须手动将两个短裤放入一个int中,然后将其打包。看起来太突兀。

请问你能告诉我短裤需要多少个字节,在这里使用short而不是int是否合理?

UPDATE:

我更新了我的问题,为未来的读者。

所以,我写了一个测试应用程序,我发现在我的情况下绝对没有理由使用short,因为它需要与int相同的空间。但是,如果我定义那样的短裤的数组:

​​3210

然后它需要较少的空间比整数的数组:

protected int[] myValues[2]; 

回答

5

从技术上讲,在Java语言中,short是2个字节。但是在JVM中,short存储类型,而不是完整的原始数据类型,如int,floatdouble。 JVM寄存器一次只能保存4个字节;没有半字或字节寄存器。 JVM是否实际存储了一个对象内的两个字节的short,或者它是否总是以4字节存储,实际上取决于实现。

这一切都适用于“真正”的JVM。 Dalvik是否以不同的方式做事?不知道。

+0

所以,似乎没有理由使用短,如果我想实现更少的内存使用量? – 2012-01-13 19:10:28

+1

我会编写一个测试程序来创建大量对象,并使用'Runtime.freeMemory()'前后测量空闲内存,并在实际的生产JVM上运行它。这样做既可以定义对象,也可以查看是否可以检测到不同。有可能没有什么区别,但是这会让你看清楚。 – 2012-01-13 19:13:34

+0

我不认为这取决于实现,至少在数组的情况下,如果它将支持JNI。 – 2012-01-13 19:45:06

1

根据该Java Virtual Machine Specification, Sec. 2.4.1,一个short是总是精确两个字节。

Java Native Interface允许从本机代码直接访问存储在虚拟机中的原语阵列。类似的事情可能发生在Android's JNI。这几乎可以保证Java short[]将在JVM兼容环境或Dalvik虚拟机中成为一个2字节值的数组。

+0

但在我的情况下,有一个类的实例数组包含两个短裤,而不是像'short []'这样的数组。那么,我真的需要测试它。并感谢链接,我会检查它。 – 2012-01-13 20:17:22