dalvikでは、doubleフィールドとlongフィールドは8バイトであり、その他すべて(shortを含む)は4バイトです。
一方、短い配列は、要素ごとに2バイトを必要とします(配列とオブジェクトの簿記のための先行スペースに加えて)。
配列
new-array
オペコードはスペースを割り当てるために呼び出します(dvmAllocArrayByClass
71行目)。次に、これは呼び出しますdvmAllocPrimitiveArray
(行113)。のスイッチでdvmAllocPrimitiveArray
は、「S」の場合が短い配列に使用されます。allocArray
width = 2で呼び出していることがわかります(38行目)。
内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
オペコードは(181行目)を呼び出して、dvmAllocObject
新しいオブジェクトにスペースを割り当てます。objectSize
割り当てられるサイズは、のフィールドに基づいていますClassObject
。objectSize
に設定されていcomputeFieldOffsets
ます(行3543)。この関数でfieldOffsetがインクリメントされるすべてのインスタンスを見つけると、常に4バイト単位でインクリメントされていることがわかります。
短いフィールドは4バイトかかります。