英文:
forbid inlining in golang
问题
有没有办法指示Go编译器不内联?
$ cat primes.go
package main
import "fmt"
//go:noinline
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
,它存在吗?
英文:
is there any way to instruct the go compiler to not inline?
$ 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) {
the equivalent to gcc -O0
I guess - does it exist?
答案1
得分: 11
你可以使用//go:noinline
指令来禁止特定函数的内联。将其放置在你希望应用该指令的函数之前:
//go:noinline
func isPrime(p int) bool {
// ...
}
如果你想禁止所有的内联操作,你可以使用-gcflags=-l
标志,例如:
go build -gcflags=-l primes.go
相关博文请参考:Dave Cheney: Go中的中间栈内联
英文:
You may use the //go:noinline
pragma to disable inlining of specific functions. Place it before the function you wish to apply it on:
//go:noinline
func isPrime(p int) bool {
// ...
}
If you want to disable all inlinings, you may use the -gcflags=-l
flag, e.g.:
go build -gcflags=-l primes.go
See related blog post: Dave Cheney: Mid-stack inlining in Go
答案2
得分: 5
你可以阅读关于golang编译的文档。
> //go:noinline
>
> //go:noinline指令必须跟在函数声明后面。它指定函数调用不应该被内联,覆盖编译器的通常优化规则。通常只有在特殊的运行时函数或调试编译器时才需要使用。
简而言之,你只需要在isPrime函数上面的那一行添加//go:noinline
。
//go:noinline
func isPrime(p int) bool {
// ...
}
英文:
You can read the documentation of golang about compile
> //go:noinline
>
> The //go:noinline directive must be followed by a function declaration. It specifies that calls to the function should not be inlined, overriding the compiler's usual optimization rules. This is typically only needed for special runtime functions or when debugging the compiler.
In short, you only need to add //go:noinline
to the line above your isPrime function.
//go:noinline
func isPrime(p int) bool {
// ...
}
通过集体智慧和协作来改善编程学习和解决问题的方式。致力于成为全球开发者共同参与的知识库,让每个人都能够通过互相帮助和分享经验来进步。
评论