是否可以内联函数,包含Golang中的循环?

时间:2017-08-23 10:18:08

标签: performance go

例如,我在golang中进行了以下测试:

// inline-tests.go
package inlinetests

func plus(a, b int) int {
    return a + b
}

func plus_plus(a, b, c int) int {
    return plus(plus(a, b), plus(b, c))
}

func plus_iter(l ...int) (res int) {
    for _, v := range l {
        res += v
    }
    return
}

如果我尝试构建它,我会收到以下内容:

go build -gcflags=-m inline-tests.go
# command-line-arguments
./inline-tests.go:4: can inline plus
./inline-tests.go:8: can inline plus_plus
./inline-tests.go:9: inlining call to plus
./inline-tests.go:9: inlining call to plus
./inline-tests.go:9: inlining call to plus
./inline-tests.go:12: plus_iter l does not escape

有没有办法让编译器内联plus_iter?如果,是否有任何方法可以内联地图迭代?

2 个答案:

答案 0 :(得分:12)

  

Go Wiki

     

CompilerOptimizations

     

功能内联

     

仅内联简短的功能。要内联函数   必须包含少于约40个表达式且不包含复杂表达式   函数调用,循环,标签,闭包,恐慌,   恢复,选择,切换'等等。

目前,带有循环的函数没有内联。

答案 1 :(得分:1)

从 1.16 版开始: https://golang.org/doc/go1.16#compiler

<块引用>

编译器现在可以使用未标记的 for 循环、方法值和类型开关来内联函数。内联程序还可以检测更多可能内联的间接调用。