去空map内存分配

问题描述 投票:0回答:1
当我们需要键/值指针时,即使在空映射中,go 映射迭代也会使用内存分配!虽然它不应该分配任何新内存并且 -benchmem 结果必须返回 0 allocs/op,而这里它变成 1 allocs/op,问题是:发生了什么以及为什么?

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
    
dictionary go memory-management benchmarking
1个回答
0
投票
您正在使用旧版本(

已更改< 1.22) of Go for your benchmarks, but don't mention that. In newer versions this

这里发生的事情是,在旧版 Go 版本中,

k

one 变量,在您的示例中转义了 (&k
),因此它被分配在堆栈上。它永远不会被使用,因为范围为空,但编译器无法证明这一点,并且此时变量已经分配了。

© www.soinside.com 2019 - 2024. All rights reserved.