mirror of
https://github.com/golang/go
synced 2024-11-26 15:36:59 -07:00
fbfc2031a6
Handle make(map[any]any) and make(map[any]any, hint) where hint <= BUCKETSIZE special to allow for faster map initialization and to improve binary size by using runtime calls with fewer arguments. Given hint is smaller or equal to BUCKETSIZE in which case overLoadFactor(hint, 0) is false and no buckets would be allocated by makemap: * If hmap needs to be allocated on the stack then only hmap's hash0 field needs to be initialized and no call to makemap is needed. * If hmap needs to be allocated on the heap then a new special makehmap function will allocate hmap and intialize hmap's hash0 field. Reduces size of the godoc by ~36kb. AMD64 name old time/op new time/op delta NewEmptyMap 16.6ns ± 2% 5.5ns ± 2% -66.72% (p=0.000 n=10+10) NewSmallMap 64.8ns ± 1% 56.5ns ± 1% -12.75% (p=0.000 n=9+10) Updates #6853 Change-Id: I624e90da6775afaa061178e95db8aca674f44e9b Reviewed-on: https://go-review.googlesource.com/61190 Run-TryBot: Martin Möhrmann <moehrmann@google.com> TryBot-Result: Gobot Gobot <gobot@golang.org> Reviewed-by: Keith Randall <khr@golang.org>
43 lines
1.1 KiB
Go
43 lines
1.1 KiB
Go
// errorcheck -0 -live -wb=0
|
|
|
|
// Copyright 2014 The Go Authors. All rights reserved.
|
|
// Use of this source code is governed by a BSD-style
|
|
// license that can be found in the LICENSE file.
|
|
|
|
// liveness tests with inlining ENABLED
|
|
// see also live.go.
|
|
|
|
package main
|
|
|
|
// issue 8142: lost 'addrtaken' bit on inlined variables.
|
|
// no inlining in this test, so just checking that non-inlined works.
|
|
|
|
func printnl()
|
|
|
|
//go:noescape
|
|
func useT40(*T40)
|
|
|
|
type T40 struct {
|
|
m map[int]int
|
|
}
|
|
|
|
func newT40() *T40 {
|
|
ret := T40{}
|
|
ret.m = make(map[int]int, 42) // ERROR "live at call to makemap: &ret$"
|
|
return &ret
|
|
}
|
|
|
|
func bad40() {
|
|
t := newT40() // ERROR "live at call to makemap: .autotmp_[0-9]+ ret$"
|
|
printnl() // ERROR "live at call to printnl: .autotmp_[0-9]+ ret$"
|
|
useT40(t) // ERROR "live at call to useT40: .autotmp_[0-9]+ ret$"
|
|
}
|
|
|
|
func good40() {
|
|
ret := T40{}
|
|
ret.m = make(map[int]int, 42) // ERROR "live at call to makemap: .autotmp_[0-9]+ ret$"
|
|
t := &ret
|
|
printnl() // ERROR "live at call to printnl: .autotmp_[0-9]+ ret$"
|
|
useT40(t) // ERROR "live at call to useT40: .autotmp_[0-9]+ ret$"
|
|
}
|