例如,我在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吗?如果是,有什么方法可以内联映射迭代吗?
发布于 2017-08-23 11:04:02
去Wiki CompilerOptimizations 功能衬里 只有简短和简单的函数是内联的。要内联一个函数,必须包含少于40个表达式,并且不包含函数调用、循环、标签、闭包、恐慌、恢复、选择、开关等复杂内容。
目前,带循环的函数没有内联。
发布于 2021-03-28 18:41:50
截至go版本1.16:https://golang.org/doc/go1.16#compiler
编译器现在可以使用非标记for循环、方法值和类型开关的内联函数。内联还可以检测到更多的间接调用,其中内联是可能的。
https://stackoverflow.com/questions/45836981
复制相似问题