在 dalvik 中,double 和 long 字段是 8 个字节,其他所有内容(包括 short)都是 4 个字节。
另一方面,短数组每个元素占用 2 个字节(除了数组+对象簿记的前期空间)。
数组
new-array
操作码调用(第dvmAllocArrayByClass
71 行)分配空间。然后调用dvmAllocPrimitiveArray
(第 113 行)。在 switch in 中dvmAllocPrimitiveArray
,“S”大小写用于短数组。你可以看到它调用allocArray
(第 38 行)width=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 行)为新对象分配空间。分配的大小基于 的objectSize
字段ClassObject
。objectSize
设置在computeFieldOffsets
(第 3543 行)。如果您在此函数中找到 fieldOffset 递增的每个实例,您会注意到它始终以 4 个字节的步长递增。
短字段占用 4 个字节。