为了账号安全,请及时绑定邮箱和手机立即绑定

如何避免匿名函数中的堆分配?

如何避免匿名函数中的堆分配?

Go
慕尼黑的夜晚无繁华 2022-09-19 10:24:00
下面是包含两个函数的示例。但是,匿名函数 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

请注意,如果将 的值更改为大于 ,则还需要分配:_int255

var _int int32 = 1000 // This will also require allocation when passed to f0()


查看完整回答
反对 回复 2022-09-19
  • 1 回答
  • 0 关注
  • 63 浏览
慕课专栏
更多

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信