TL; DRは差はありません。変数がスタックまたはヒープに割り当てられるかどうかは、その使用方法によって異なります。
私はアセンブリの様々な初期化と呼び出しの場合から生成するにはdeep diveでした。 v
とb
の間に生成されたアセンブリはほとんど同じです。特に、d
はスタックに割り当てられません。
変数がヒープ割り当てかスタック割り当てかを決定する方法は、その使用方法です。パラメータとして渡されたポインタを値として使用した関数に渡すことは、変数にヒープ割り当てを強制しません。しかし、これは保証されていませんが、仕様によって、Goコンパイラは最適化またはコード生成に必要なスタック間の変数をスタック間で自由に移動できます。 Go abstracts away Heap vs Stackと同じように、C/C++はRAM対レジスタを抽象化します。
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)
が代わりに使用されていた場合にtrueになります。私は、あなたが聞きたいと思っていた疑問に答えるためにちょっと騙しました。