dalvikでは、doubleフィールドとlongフィールドは8バイトであり、その他すべて(shortを含む)は4バイトです。
一方、短い配列は、要素ごとに2バイトを必要とします(配列とオブジェクトの簿記のための先行スペースに加えて)。
配列
new-arrayオペコードはスペースを割り当てるために呼び出します(dvmAllocArrayByClass71行目)。次に、これは呼び出しますdvmAllocPrimitiveArray(行113)。のスイッチでdvmAllocPrimitiveArrayは、「S」の場合が短い配列に使用されます。allocArraywidth = 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バイトかかります。