在dalvik中,double和long字段是8個字節,其他所有內容(包括short)都是4個字節。
另一方面,短數組每個元素需要2個字節(除了數組+對象簿記的前期空間外)。
陣列
的new-array
操作碼調用dvmAllocArrayByClass
(線71)到分配空間。然後調用dvmAllocPrimitiveArray
(第113行)。在dvmAllocPrimitiveArray
的開關中,'S'情況用於短陣列。你可以看到它調用allocArray
(第38行),寬度= 2。
在allocArray
,它執行以下計算來計算所述陣列的尺寸大小:
size_t elementShift = sizeof(size_t) * CHAR_BIT - 1 - CLZ(elemWidth);
size_t elementSize = length << elementShift;
size_t headerSize = OFFSETOF_MEMBER(ArrayObject, contents);
size_t totalSize = elementSize + headerSize;
對於短的32位的系統上,該計算將是:
size_t elementShift = (4 * 8) - 1 - 30; //== 1;
size_t elementSize = length << 1; //i.e. length * 2
size_t headerSize = <some constant value>;
size_t totalSize = length*2 + <some constant value>;
短陣列每個元素需要2個字節。
字段
的new-instance
操作碼調用dvmAllocObject
(線181),以供新對象分配空間。分配的大小基於字段ClassObject
。 objectSize
設置在computeFieldOffsets
(3543行)。如果您發現fieldOffset在此函數中增加的每個實例,您會注意到它總是以4個字節爲單位遞增。
短字段需要4個字節。
給準備(格式)編輯我的文章的用戶:謝謝。不幸的是,該系統沒有讓我接受它,它說「編輯已被拒絕」。所以,據我所知,我試圖自己實施編輯。 –
「Java虛擬機對於短字段使用int大小的寬度也是衆所周知的」,您可以使用任何引用來備份此語句嗎? – kosa
我在那裏有點不準確,所以我編輯了它。這裏有一些相關的stackoverflow主題:http://stackoverflow.com/questions/8855754/android-does-short-take-really-2-bytes http://stackoverflow.com/questions/1904857/which-is-better- to-use-short-or-int –