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

Performance 是否可以内联函数,在Golang中包含循环?,performance,go,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 {

例如,我在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
有没有办法让编译器内联
加上iter
?如果,是否有方法内联映射迭代

函数内联

只有简短的函数是内联的。内联到函数中 必须包含少于40个表达式且不包含复杂表达式 函数调用、循环、标签、闭包、恐慌、, 恢复、选择、切换等

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

从go版本1.16开始:

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


可以在这里找到内联规则:。没有手动控制什么是内联的,什么不是内联的,所以:没有。@icza关于循环没有什么,不是吗?我只是做了一个快速测试,用等效的标签替换for循环,goto语句允许内联,这让我很惊讶,因为我认为循环不能内联是有技术原因的。