@@ -1162,3 +1162,78 @@ indirectkey 变成了 true:
1162
1162
```
1163
1163
1164
1164
indirectvalue 也是完全一样的,超过 128 字节(不含)时,会被赋值为 true,并退化为指针。
1165
+
1166
+ ## overflow 处理
1167
+
1168
+ 思路,从 nextOverflow 中拿 overflow bucket,如果拿到,就放进 hmap.extra.overflow 数组,并让 bmap 的 overflow pointer 指向这个 bucket。
1169
+
1170
+ 如果没找到,那就 new 一个。
1171
+
1172
+ ``` go
1173
+ func (h *hmap ) newoverflow (t *maptype , b *bmap ) *bmap {
1174
+ var ovf *bmap
1175
+ if h.extra != nil && h.extra .nextOverflow != nil {
1176
+ // We have preallocated overflow buckets available.
1177
+ // See makeBucketArray for more details.
1178
+ ovf = h.extra .nextOverflow
1179
+ if ovf.overflow (t) == nil {
1180
+ // We're not at the end of the preallocated overflow buckets. Bump the pointer.
1181
+ h.extra .nextOverflow = (*bmap)(add (unsafe.Pointer (ovf), uintptr (t.bucketsize )))
1182
+ } else {
1183
+ // This is the last preallocated overflow bucket.
1184
+ // Reset the overflow pointer on this bucket,
1185
+ // which was set to a non-nil sentinel value.
1186
+ ovf.setoverflow (t, nil )
1187
+ h.extra .nextOverflow = nil
1188
+ }
1189
+ } else {
1190
+ ovf = (*bmap)(newobject (t.bucket ))
1191
+ }
1192
+ h.incrnoverflow ()
1193
+ if t.bucket .kind &kindNoPointers != 0 {
1194
+ h.createOverflow ()
1195
+ *h.extra .overflow = append (*h.extra .overflow , ovf)
1196
+ }
1197
+ b.setoverflow (t, ovf)
1198
+ return ovf
1199
+ }
1200
+ ```
1201
+
1202
+ ``` go
1203
+ func (h *hmap ) createOverflow () {
1204
+ if h.extra == nil {
1205
+ h.extra = new (mapextra)
1206
+ }
1207
+ if h.extra .overflow == nil {
1208
+ h.extra .overflow = new ([]*bmap)
1209
+ }
1210
+ }
1211
+ ```
1212
+
1213
+ ``` go
1214
+ // incrnoverflow increments h.noverflow.
1215
+ // noverflow counts the number of overflow buckets.
1216
+ // This is used to trigger same-size map growth.
1217
+ // See also tooManyOverflowBuckets.
1218
+ // To keep hmap small, noverflow is a uint16.
1219
+ // When there are few buckets, noverflow is an exact count.
1220
+ // When there are many buckets, noverflow is an approximate count.
1221
+ func (h *hmap ) incrnoverflow () {
1222
+ // We trigger same-size map growth if there are
1223
+ // as many overflow buckets as buckets.
1224
+ // We need to be able to count to 1<<h.B.
1225
+ if h.B < 16 {
1226
+ h.noverflow ++
1227
+ return
1228
+ }
1229
+ // Increment with probability 1/(1<<(h.B-15)).
1230
+ // When we reach 1<<15 - 1, we will have approximately
1231
+ // as many overflow buckets as buckets.
1232
+ mask := uint32 (1 )<<(h.B -15 ) - 1
1233
+ // Example: if h.B == 18, then mask == 7,
1234
+ // and fastrand & 7 == 0 with probability 1/8.
1235
+ if fastrand ()&mask == 0 {
1236
+ h.noverflow ++
1237
+ }
1238
+ }
1239
+ ```
0 commit comments