On Fri, Mar 25, 2022 at 11:42 AM Maksadbek <a.maksad...@gmail.com> wrote:
>
> I've been reading the map internals in Go and came across into following 
> structure in source code:
>
> https://github.com/golang/go/blob/master/src/runtime/map.go#L150
>
> // A bucket for a Go map.
> type bmap struct {
> // tophash generally contains the top byte of the hash value
> // for each key in this bucket. If tophash[0] < minTopHash,
> // tophash[0] is a bucket evacuation state instead.
> tophash [bucketCnt]uint8
> // Followed by bucketCnt keys and then bucketCnt elems.
> // NOTE: packing all the keys together and then all the elems together makes 
> the
> // code a bit more complicated than alternating key/elem/key/elem/... but it 
> allows
> // us to eliminate padding which would be needed for, e.g., map[int64]int8.
> // Followed by an overflow pointer.
> }
>
> But if you scroll down the file and see the usage of this structure, actually 
> it has the following structure:
>
> // NOT REAL
> type bmap struct {
>     topbits [8]uint8
>     keys [8]keytype
>     values [8]valuetype
>     pad uintptr
>     overflow uintptr
> }
>
> I can't find out the place in the source code where this structure is 
> extended. In order to access those extra fields, authors do some pointer 
> arithmetics:
>
> https://github.com/golang/go/blob/master/src/runtime/map.go#L445
> https://github.com/golang/go/blob/master/src/runtime/map.go#L501
>
> But in order to access those memory points, they needs to be allocated. Where 
> does the allocation happen ?

The allocation occurs in calls to newobject in hmap.newoverflow and
calls to newarray in makeBucketArray.  But you are probably asking
where the t.bucket struct is defined.  That happens in the compiler in
MapBucketType in cmd/compile/internal/reflectdata/reflect.go.

Ian

-- 
You received this message because you are subscribed to the Google Groups 
"golang-nuts" group.
To unsubscribe from this group and stop receiving emails from it, send an email 
to golang-nuts+unsubscr...@googlegroups.com.
To view this discussion on the web visit 
https://groups.google.com/d/msgid/golang-nuts/CAOyqgcVSZfqQBk0r4rX7aq_VQW9BwQQ-%3D89aSZxOV20myB_JyQ%40mail.gmail.com.

Reply via email to