2012-01-13 5 views
5

내 앱을 디자인하는 방법을 결정하려고합니다.Android : short가 실제로 2 바이트를 차지합니까?

public class ParamValue { 

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

    /* 
    * ... 
    */ 
} 

나는이 인스턴스의 배열이 있습니다

난 그냥이 같은 클래스의 300 인스턴스를 가지고있다. 나는이 반바지가 실제로 2 바이트를 취하는 지 알지 못하거나 어쨌든 4 바이트를 차지합니까?

그리고 AIDL을 통해 이러한 개체의 목록을 List<Parcelable>으로 전달해야합니다. 소포는 readShort()writeShort()이 아니며 int과 만 작동합니다. 그래서, 여기도 짧은 사용하려면 수동으로 하나의 int로 두 개의 내 반바지를 팩, 그것을 포장하고 다시 풀다합니다. 너무 눈에 띄지 않습니다.

반바지 얼마나 걸릴지 말해 주시겠습니까? 여기 int 대신 short를 사용하는 것이 합리적입니까?

UPDATE : 나는 미래의 독자에 대한 내 질문에 업데이트

.

그래서 테스트 앱을 작성했고 short을 사용할 이유가 전혀 없다는 것을 알아 냈습니다. int과 같은 공간이 필요하기 때문입니다. 나는 그런 반바지의 배열을 정의한다면 :

protected short[] myValues[2]; 

는 그것의 int의 배열보다 적은 공간을 차지 :

protected int[] myValues[2]; 

답변

5

기술적으로 Java 언어에서 short은 2 바이트입니다. 하지만 JVM 내부에서 short저장 유형이고 int, float 또는 double과 같은 본격적인 기본 데이터 유형이 아닙니다. JVM 레지스터는 항상 한 번에 4 바이트를 유지합니다. 하프 워드 또는 바이트 레지스터가 없습니다. JVM이 실제로 오브젝트 내부에 2 바이트의 short을 저장하는지 또는 항상 4 바이트로 저장되는지 여부는 실제로 구현에 달려 있습니다.

이 항목은 모두 "실제"JVM에 적용됩니다. 달빅은 다르게 일을합니까? 던노.

+0

그래서, 적은 메모리 사용량을 얻으려고 노력하면 짧은 사용할 이유가없는 것 같아? –

+1

많은 수의 객체를 생성하고'Runtime.freeMemory()'를 사용하여 프리 메모리를 측정하고 실제 프로덕션 JVM에서 실행하는 테스트 프로그램을 작성할 것입니다. 객체를 정의하는 두 가지 방법 모두에서이 작업을 수행하고 차이점을 감지 할 수 있는지 확인하십시오. 차이가있을 수도 있고 그렇지 않을 수도 있지만, 이것은 당신이 확실히 보게 할 것입니다. –

+0

적어도 배열의 경우 JNI를 지원할 것이라면 구현에 달려 있다고 생각하지 않습니다. –

1

Java Virtual Machine Specification, Sec. 2.4.1에 따르면, short는 항상 정확히 두 바이트입니다.

Java Native Interface은 원시 코드에서 VM에 저장된 프리미티브의 배열에 직접 액세스 할 수 있습니다. 비슷한 일이 Android's JNI에서 발생할 수 있습니다. 이 점은 Java short[]이 JVM 호환 환경이나 Dalvik 가상 시스템에서 2 바이트 값의 배열이되도록 보장합니다.

+0

하지만, 나의 경우에는'short []'와 같은 배열이 아니라 두 개의 short를 포함하는 클래스의 인스턴스 배열이 있습니다. 글쎄, 나는 그것을 시험 할 필요가있다. 그리고 링크에 감사드립니다, 나는 그것을 조사 할 것입니다. –

관련 문제