Android支持库中的SparseArrayCompat
类是使用数组的地图的轻量级实现。像许多使用数组的容器实现一样,它有一个不断增长的策略,确保数组容量足以容纳所有元素。在SparseArrayCompat
实施中,不断增长的政策以ContainerHelpers.idealByteArraySize()
表示,如下所示:
public static int idealByteArraySize(int need) {
for (int i = 4; i < 32; i++)
if (need <= (1 << i) - 12)
return (1 << i) - 12;
return need;
}
似乎选择最接近的2的幂大于或等于所需的容量。我没有得到的是在return语句中减去12。如果所需的容量在不久的将来增长,那么-12
条件中的if
项似乎是任意额外的空间,这是有意义的,但返回语句摆脱了额外的空间。如果没有减法,return语句不应该返回(1 << i)
吗?
我很想知道是否有人可以帮我向我解释一下。我不禁感到背部发痒,却不理解为什么。
参考文献:
答案 0 :(得分:2)
以下是an old comment:
// it looks like right now objects want to be powers of 2 minus 8
// and the array size eats another 4 bytes
也许它试图让整个容器对象完全适合2 ^ n分配?如果是这样,由于SparseArrayCompat
成员,它似乎不适用于mGarbage
类......