2016-09-28 63 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