1 回答
TA贡献1998条经验 获得超6个赞
为什么它们是无序的?
因为这为运行时实现地图类型提供了更大的自由。虽然我们知道 Go 的(当前)实现是哈希图,但语言规范允许使用任何映射实现,例如哈希图、树图等。而且不必记住顺序,这允许运行时更有效地完成其工作并使用更少的资源记忆。
阿德里安的评论很好地总结了秩序是很少需要的,总是维持秩序将是一种浪费。当您确实需要顺序时,可以使用提供顺序的数据结构。
由于密钥的哈希值位于存储桶内的有序数组中,为什么每次我循环遍历地图时它的顺序都不同?
Go 作者有意将 Map 的迭代顺序随机化(这样我们凡人就不会依赖于固定的顺序)。
实际值存储在内存中的什么位置?
“哪里”由 指定hmap.buckets
。这是一个指针值,它指向内存中的一个数组,一个保存桶的数组。
buckets unsafe.Pointer // array of 2^B Buckets. may be nil if count==0.
Sohmap.buckets
指向保存存储桶的连续内存段。存储桶是由 来“建模”的bmap
,但这不是它实际的内存布局。存储桶以一个数组开始,该数组保存存储桶 ( tophash [bucketCnt]uint8
) 中键的顶部哈希字节,该数组后面是bucketCnt
存储桶的键,然后是bucketCnt
存储桶的值。最后还有一个溢出指针。
将存储桶想象成这样的概念类型,它“可视化”键和值在内存中的位置:
type conceptualBucket struct {
tophash [bucketCnt]uint8
keys [bucketCnt]keyType
values [bucketCnt]valueType
overflowPtr uintptr
}
注意:bucketCnt是一个编译时间常数8,它是一个桶可以容纳的键/元素对的最大数量。
当然,这个“图片”是不准确的,但它给出了键和值存储在哪里/如何存储的想法。
- 1 回答
- 0 关注
- 109 浏览
添加回答
举报