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



例如,我在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?如果是,有没有办法进行内联地图迭代?

Go Wiki

编译器优化

函数内联

仅内联简短的函数。内联函数 必须包含少于 ~40 个表达式且不包含复杂表达式 诸如函数调用、循环、标签、闭包、恐慌之类的东西, 恢复、选择、切换等。

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

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

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

最新更新