【问题标题】:Android: does short take really 2 bytes?Android:short 真的需要 2 个字节吗?
【发布时间】:2012-01-13 19:00:09
【问题描述】:

我正在尝试决定如何设计我的应用。

我有大约 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,打包,然后解包回来。看起来太突兀了。

你能告诉我shorts需要多少字节吗?在这里使用short而不是int有意义吗?

更新:

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

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

 protected short[] myValues[2];

那么它比整数数组占用更少的空间:

 protected int[] myValues[2];

【问题讨论】:

    标签: android short


    【解决方案1】:

    从技术上讲,在 Java 语言中,short 是 2 个字节。不过,在 JVM 内部,short 是一个存储类型,而不是像 intfloatdouble 这样的成熟原始数据类型。 JVM 寄存器一次总是保存 4 个字节;没有半字或字节寄存器。 JVM 是否实际上将short 存储在对象内的两个字节中,或者它是否始终存储为 4 个字节,实际上取决于实现。

    这一切都适用于“真正的”JVM。 Dalvik 做事有什么不同吗?不知道。

    【讨论】:

    • 那么,如果我试图减少内存使用,似乎没有理由使用short?
    • 我将编写一个测试程序,该程序创建大量对象并使用Runtime.freeMemory() 测量前后的空闲内存,并在实际生产JVM 上运行它。对定义对象的两种方式都执行此操作,并查看是否可以检测到差异。可能有区别,也可能没有区别,但这会让您确定。
    • 我不认为这取决于实现,至少在数组的情况下,如果它要支持 JNI。
    • 同意,不过数组不同于普通对象。
    • @Ernest Friedman-Hill,我写了一个测试程序,我发现在我的例子中shortint 占用相同的空间。我更新了我的问题(添加了更详细的解释)。再次感谢。
    【解决方案2】:

    根据Java Virtual Machine Specification, Sec. 2.4.1short 总是正好是两个字节。

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

    【讨论】:

    • 但是,在我的例子中,有一个包含两个短裤的类实例数组,而不是像short[] 这样的数组。好吧,我真的需要测试它。并感谢您的链接,我会检查它。
    猜你喜欢
    • 2017-07-30
    • 2012-01-12
    • 2021-04-26
    • 1970-01-01
    • 2015-04-15
    • 2023-03-26
    • 2012-03-13
    • 2020-01-29
    • 2014-02-28
    相关资源
    最近更新 更多