2012-01-13 23 views
5

Tôi đang cố đưa ra quyết định cách thiết kế ứng dụng của mình.Android: có ngắn thực sự mất 2 byte?

Tôi có khoảng 300 trường hợp của lớp chỉ như thế này:

public class ParamValue { 

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

    /* 
    * ... 
    */ 
} 

Tôi có một mảng của những trường hợp này. Tôi không thể tìm ra những quần short thực sự mất 2 byte hoặc họ mất anyway 4 byte?

Và tôi cần chuyển danh sách các đối tượng này qua AIDL dưới dạng List<Parcelable>. Bưu kiện không được readShort()writeShort(), nó chỉ có thể hoạt động với int. Vì vậy, để sử dụng ngắn ở đây quá tôi phải tự đóng gói hai quần short của tôi vào một int, bưu kiện nó, và sau đó giải nén lại. Trông quá khó chịu.

Bạn có thể cho tôi biết có bao nhiêu byte quần short không, và có sử dụng ngắn gọn thay vì int ở đây không?

UPDATE:

tôi cập nhật câu hỏi của tôi cho độc giả trong tương lai.

Vì vậy, tôi đã viết một ứng dụng thử nghiệm và tôi đã tìm ra rằng trong trường hợp của tôi hoàn toàn không có lý do để sử dụng short, bởi vì nó có cùng một không gian như int. Nhưng nếu tôi xác định mảng quần short như thế:

protected short[] myValues[2]; 

sau đó phải mất ít không gian hơn mảng ints:

protected int[] myValues[2]; 

Trả lời

5

Về mặt kỹ thuật, trong ngôn ngữ Java, short là 2 byte. Tuy nhiên, bên trong JVM, short là loại lưu trữ , không phải là loại dữ liệu nguyên thủy chính thức như int, float hoặc double. Các thanh ghi JVM luôn giữ 4 byte tại một thời điểm; không có đăng ký nửa từ hoặc byte. Liệu JVM có thực sự lưu trữ một short trong hai byte bên trong một đối tượng hay không hoặc liệu nó có luôn được lưu trữ dưới dạng 4 byte hay không, thực sự là tùy thuộc vào việc thực hiện.

Tất cả điều này đều giữ cho JVM "thực". Dalvik có làm những việc khác nhau không? Dunno.

+0

vì vậy, nó có vẻ như không có lý do để sử dụng ngắn nếu tôi cố gắng để đạt được sử dụng bộ nhớ ít hơn? –

+1

Tôi sẽ viết một chương trình thử nghiệm để tạo ra một số lượng lớn các đối tượng và đo bộ nhớ miễn phí trước và sau với 'Runtime.freeMemory()' và chạy nó trên JVM sản xuất thực tế. Làm điều này cho cả hai cách xác định đối tượng và xem liệu bạn có thể phát hiện sự khác biệt hay không. Có thể có hoặc không có sự khác biệt, nhưng điều này sẽ cho bạn thấy chắc chắn. –

+0

Tôi không nghĩ rằng nó được thực hiện, ít nhất là trong trường hợp mảng, nếu nó sẽ hỗ trợ JNI. –

1

Theo Java Virtual Machine Specification, Sec. 2.4.1, một short luôn là chính xác hai byte.

Java Native Interface cho phép truy cập trực tiếp từ mã gốc sang các mảng nguyên thủy được lưu trữ trong máy ảo. Một điều tương tự có thể xảy ra trong Android's JNI. Điều này khá nhiều đảm bảo rằng một Java short[] sẽ là một mảng các giá trị 2 byte trong môi trường tuân thủ JVM hoặc trong một máy ảo Dalvik.

+0

nhưng, trong trường hợp của tôi có một loạt các phiên bản của lớp có chứa hai quần short, không phải là một mảng như 'short []'. Vâng, tôi thực sự cần phải kiểm tra nó. Và cảm ơn các liên kết, tôi sẽ kiểm tra nó. –

Các vấn đề liên quan