下面是包含两个函数的示例。但是,匿名函数 f0 由于某种奇怪的原因,具有浮点数和字符串变量,将它们移动到堆中。任何想法如何避免不必要的分配?import ( "testing")var _int int32 = 10var _float float32 = 10var _string = "go"var f0 = func(v interface{}) { _ = v}func f1(v interface{}) { _ = v}func Benchmark(b *testing.B) { for i := 0; i < b.N; i++ { f0(_int) f1(_int) f0(_float) // <- alloc f1(_float) f0(_string) // <- alloc f1(_string) }}
1 回答
扬帆大鱼
TA贡献1799条经验 获得超9个赞
由于函数的参数类型为 ,因此在将值传递给它们时必须创建隐式接口值。这种接口价值创造是需要分配的。interface{}
它不会发生,因为该函数将被内联。f1()
它也不会发生,因为它是一个“小”整数值,并且Go 1.5增加了优化,以将小整数(0到255)包装在接口值中,因此不需要分配。_int
请注意,如果将 的值更改为大于 ,则还需要分配:_int
255
var _int int32 = 1000 // This will also require allocation when passed to f0()
- 1 回答
- 0 关注
- 63 浏览
添加回答
举报
0/150
提交
取消