禁止在golang中进行内联处理。

5

有没有什么方法可以指示Go编译器内联代码?

$ cat primes.go
package main
import ("fmt")

func isPrime(p int) bool {
    for i := 2; i < p; i += 1 {
        for j := 2; j < p; j += 1 {
            if i*j == p {
                return false
            }
        }
    }
    return true
}

func main() {
    for p := 2; p < 100; p+= 1 {
        if isPrime(p) {
            fmt.Println(p)
        }
    }
}
$ go build primes.go
$ objdump -D -S primes > primes.human
$ grep -rn "isPrime" primes.human
210091:        if isPrime(p) {

我猜这个等同于gcc -O0,有这样的东西吗?

2个回答

11

您可以使用//go:noinline编译指示符禁用特定函数的内联。将其放置在要应用该指示符的函数之前:

//go:noinline
func isPrime(p int) bool {
    // ...
}

如果你想禁用所有内联,请使用-gcflags=-l标志,例如:

go build -gcflags=-l primes.go

相关博客文章请见:Dave Cheney: Go 中的中间堆栈内联


5
你可以阅读有关golang编译的文档。 godoc/compile //go:noinline指令必须跟着一个函数声明。它指定了对该函数的调用不应该被内联,覆盖编译器的通常优化规则。这通常只在特殊的运行时函数或调试编译器时需要使用。
简而言之,你只需要在isPrime函数所在的行上方添加 //go:noinline 即可。
//go:noinline
func isPrime(p int) bool {
    // ...
}

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接