TL;DR違いはありません1。変数がスタックまたはヒープのどちらに割り当てられるかは、その使用法によって異なります。
Goがさまざまな初期化と呼び出しのケースから生成するアセンブリについて詳しく調べました。v
と の間で生成されるアセンブリb
はほぼ同じです。特に注目すべきは、スタック1d
に割り当てられていないことです。
変数がヒープ割り当てかスタック割り当てかを決定するのは、その使用方法です。パラメーターを値としてのみ使用する関数にポインターを渡しても、変数がヒープに割り当てられることはありません。ただし、これは保証されていませんが、仕様では、最適化またはコード生成の必要に応じて、任意の Go コンパイラがスタックとヒープの間で変数を自由に移動できます。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)
}
1 : 技術的には正しくありませんが、fmt.Println(*d)
代わりに使用されていれば正しいでしょう。あなたが質問するつもりだったと思う質問に答えるために、私は少しごまかしました。