map的bucketShift

来源:1-4 Go 程序是怎么跑起来的

慕尼黑2207807

2021-05-26 21:40:49

// bucketShift returns 1<<b, optimized for code generation.
func bucketShift(b uint8) uintptr {
    // Masking the shift amount allows overflow checks to be elided.
    return uintptr(1) << (b & (sys.PtrSize*8 - 1))
}

为什么和b进行与运算是63为 那这样如果b是64的话 这块计算的值就是了

写回答

1回答

Xargin

2021-05-27

我想了想,应该是这么回事:

  1. b 不可能是 64,你算算 2 ^ 64 个 bucket 的话,会占多少内存,所以不太可能有这么多

  2. 按注释写的,这里保证移位 <= 63,所以一定不会溢出,少掉一次溢出检查

0
hargin
hp>估计这种函数是从老的 c 代码之类的地方继承来的,感觉这点性能优化可能在 map 那堆复杂操作里算不上个事。。。

h021-05-27
共1条回复

Go高级工程师实战营

慕课网与 GoCN 社区官方联手打造,定义行业Go高级人才培养标准,4个月,快速晋升为P6+/D7级高级人才。

458 学习 · 266 问题

查看课程