Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/xpath/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Go glolang编译器中的空函数优化_Go_Compiler Optimization - Fatal编程技术网

Go glolang编译器中的空函数优化

Go glolang编译器中的空函数优化,go,compiler-optimization,Go,Compiler Optimization,golang编译器是否优化空函数 我希望在构建产品时从main.go中删除调试日志代码行 梅因,加油 func main(){ logging.DebugLog(“嘿%d”,123) } 调试模式 /+builddev 包日志记录 进口( “fmt” ) func调试日志(模式字符串、参数…接口{}){ msg:=fmt.Sprintf(模式、参数…) fmt.Printf(“调试:%s\n”,msg) } 生产方式, /+build!发展 包日志记录 进口( “fmt” ) func De

golang编译器是否优化空函数

我希望在构建产品时从main.go中删除调试日志代码行

梅因,加油

func main(){
logging.DebugLog(“嘿%d”,123)
}
调试模式

/+builddev
包日志记录
进口(
“fmt”
)
func调试日志(模式字符串、参数…接口{}){
msg:=fmt.Sprintf(模式、参数…)
fmt.Printf(“调试:%s\n”,msg)
}
生产方式,

/+build!发展
包日志记录
进口(
“fmt”
)
func DebugLog(模式字符串,args…接口{}){

golang编译器是否在编译时从主函数中删除DebugLog函数行?或者干脆离开并在运行时执行?

让我详细回答这个问题

答案是肯定的,至少是golang编译器的某个版本

试验台 go版本go1.13.15 linux/amd64

cat./main.go

package main

import (
    "./fc"
)

func main() {
    fc.Dosome()
}
cat./fc/funcdummy.go

// +build !dev

package fc

func Dosome() {
}
目录/fc/func.go

// +build dev

package fc

import (
    "fmt"
)

func Dosome() {
    fmt.Println("hello world")
}
结果 grep'Dosome'-a5-b5./dumphavetag

  0x48cf69      483b6110        CMPQ 0x10(CX), SP   
  0x48cf6d      7670            JBE 0x48cfdf        
  0x48cf6f      4883ec58        SUBQ $0x58, SP      
  0x48cf73      48896c2450      MOVQ BP, 0x50(SP)   
  0x48cf78      488d6c2450      LEAQ 0x50(SP), BP   
    fc.Dosome()
  0x48cf7d      0f57c0          XORPS X0, X0        
    fmt.Println("hello world")
  0x48cf80      0f11442440      MOVUPS X0, 0x40(SP) 
  0x48cf85      488d0554120100      LEAQ 0x11254(IP), AX    
  0x48cf8c      4889442440      MOVQ AX, 0x40(SP)
grep'Dosome'-a5-b5./dumpnotag

//empty
所以,我们可以看到,空函数得到了优化,golang编译器没有更多的编译标志

更多 我发现这是相关的,所以你需要go compile的现代版本。你可以得到你想要的

我们现在进行整个子树内联和死代码消除


编译器可能会将函数内联。一般来说,这很难说清楚。想象一个调用,比如
DebugLog(“foo”,f())
。如果
f
有副作用,至少不能放弃对f的调用。这种优化通常随编译器版本的不同而变化。查看生成的程序集。请注意,编译器不能删除main中的函数调用(尽管是内联的),我怀疑当前链接器是否会删除它。您确实应该检查生成的可执行文件。请尝试使用objdump工具
//empty