TL; DR沒有區別。是否在堆棧或堆上分配變量取決於其用法。
我做了一個deep dive上的程序集生成從各種初始化和調用情況。在v
和b
之間生成的程序集幾乎相同。特別值得注意的是,d
未被分配到堆棧。
什麼決定了變量是堆分配還是堆分配是它的使用方式。將傳遞指針傳遞給僅將該參數用作值的函數不會強制變量被堆分配。但即使這並不能保證,該規範允許任何Go編譯器根據需要在堆棧和堆之間自由移動變量以進行優化或代碼生成。正如C/C++抽象掉RAM vs Register一樣,去abstracts away Heap vs Stack。
http://play.golang.org/p/vJQvWPTGeR
type Vertex struct {
X, Y float64
}
func PrintPointer(v *Vertex) {
fmt.Println(v)
}
func PrintValue(v *Vertex) {
fmt.Println(*v)
}
func main() {
a := Vertex{3, 4} // not allocated
PrintValue(&a)
b := &Vertex{3, 4} // not allocated
PrintValue(b)
c := Vertex{3, 4} // allocated
PrintPointer(&c)
d := &Vertex{3, 4} // allocated
PrintPointer(d)
}
:技術上不正確的,但如果fmt.Println(*d)
已經代替將是真實的。我騙了一些回答我認爲你應該問的問題。