go - 禁止在 golang 内联

标签 go inline

有什么方法可以指示 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我猜 - 它存在吗?

最佳答案

您可以使用 //go:noinline pragma 禁用特定函数的内联。将它放在您希望应用它的函数之前:

//go:noinline
func isPrime(p int) bool {
    // ...
}
如果你想禁用所有内联,你可以使用 -gcflags=-l标志,例如:
go build -gcflags=-l primes.go
见相关博文:Dave Cheney: Mid-stack inlining in Go

关于go - 禁止在 golang 内联,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/68280753/

相关文章:

go - 显示无盲点的功能测试覆盖率

python - 如何将 scipy.weave.inline 与外部 C 库一起使用?

去测试 : only run tests that contain a build tag?

sql - 是否可以为多个请求准备一次 SQL 语句?

go - 是否有可能找出导致io.Copy失败的原因?

python - 使用内联/嵌入式图在 IPython 中运行 python 脚本

c++ - 从内联函数调用内联函数?

c++ - 将内联加速 void a(string b) { cout << b; }

html - 如何垂直对齐 td 内的 float 表格

go - 在 Go 中获取终端大小