7
type Vertex struct {
    X, Y float64
}

func main() {
    v := Vertex{3, 4}
    fmt.Println(v)

    d := &Vertex{3, 4}
    fmt.Println(d)
}

http://play.golang.org/p/XluyUHL2y7

構造体を初期化するこれら 2 つの方法の違いは何Vertexですか?

2 つ目はポインターを使用した割り当てであることは知っていますが、実際にはこのソリューションの違いはわかりません。

4

2 に答える 2

4

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)代わりに使用されていれば正しいでしょう。あなたが質問するつもりだったと思う質問に答えるために、私は少しごまかしました。

于 2013-10-18T05:59:54.317 に答える