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

下面是包含两个函数的示例。但是,匿名函数 f0 由于某种奇怪的原因,具有浮点数和字符串变量,将它们移动到堆中。任何想法如何避免不必要的分配?


import (

    "testing"

)


var _int int32 = 10

var _float float32 = 10

var _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)

    }

}


慕尼黑的夜晚无繁华
浏览 64回答 1
1回答

扬帆大鱼

由于函数的参数类型为 ,因此在将值传递给它们时必须创建隐式接口值。这种接口价值创造是需要分配的。interface{}它不会发生,因为该函数将被内联。f1()它也不会发生,因为它是一个“小”整数值,并且Go 1.5增加了优化,以将小整数(0到255)包装在接口值中,因此不需要分配。_int请注意,如果将 的值更改为大于 ,则还需要分配:_int255var&nbsp;_int&nbsp;int32&nbsp;=&nbsp;1000&nbsp;//&nbsp;This&nbsp;will&nbsp;also&nbsp;require&nbsp;allocation&nbsp;when&nbsp;passed&nbsp;to&nbsp;f0()
打开App,查看更多内容
随时随地看视频慕课网APP

相关分类

Go