2012-01-13 86 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