func BenchmarkMap(b *testing.B) {
var m map[byte]struct{}
var p *byte
for i := 0; i < b.N; i++ {
for k := range m {
p = &k
_ = p
}
}
}
$ go test -bench=Map -benchmem
BenchmarkMap-4 51860970 23.70 ns/op 1 B/op 1 allocs/op
$ #expected result:
BenchmarkMap-4 51860970 23.70 ns/op 0 B/op 0 allocs/op
已更改< 1.22) of Go for your benchmarks, but don't mention that. In newer versions this 。
这里发生的事情是,在旧版 Go 版本中,k
是one 变量,在您的示例中转义了 (
&k
),因此它被分配在堆栈上。它永远不会被使用,因为范围为空,但编译器无法证明这一点,并且此时变量已经分配了。