2016-09-28 80 views
-1
// example1.go 

packge main 

func main() { 
    s := make([]byte, 1024, 1024) 
    _ = s 
} 

旨意在堆栈和查找分配汇编代码不叫runtime.makeslicegolang组装内存分配

// example2.go 
packge main 

func main() { 
    cap := 1024 
    s := make([]byte, 1024, cap) 
    _ = s 
} 

旨意堆和查找汇编代码被分配有runtime.makeslice为什么???

// example3.go 
package main 

func main() { 
    a := 100 
    if a>1 { 
     a = 1000 
    } 
    b := interface{}(a) 
    _ = b 
} 

查找汇编代码,看看编译器是非常聪明的选择是,但example2.go为什么不这样做

+0

请冠军,你要问,并解释一下关于你想达到什么问题,你的问题。 –

+0

这完全取决于您使用的编译器实现。您没有提及编译器或版本,但标准的gc编译器不断发展,在将来的版本中可能会或可能不会产生相同的输出。 – JimB

回答

1

我认为这是你的cap变量的变动性 - 如果你改变这个到const cap = 1024runtime.makeslice呼叫就消失了。看来Go编译器*目前无法推断cap不会发生变化,即不会改变值。如你所述;在最后的例子中a在编译时被评估为1000。

*去版本的linux go1.7.1/AMD64