2013-10-16 11 views

答えて

2

どちらの場合も、Vertex構造体は同じ方法で初期化されます。

最初の式は、初期化されたVertex構造体であるvalueを返します。 6gのアラインメントルールでは、すべてのfloat64が8バイトのサイズなので、8 + 8 = 16バイト相当のVertex構造体が得られることを意味します。 2番目の式は、8 + 8 = 16バイトに十分なメモリを割り当て、頂点構造体として使用し、初期化し、ポインタを返します。アーキテクチャに応じて、サイズは4または8バイトになります。

実際には多くの違いがあります。これら2つの値のメソッドセット、Vertex構造体と* Vertexポインタは異なる場合があります。 Vertex構造体をどれくらいの頻度で渡す必要があるかによって、ポインタを渡す方が効率的かもしれません。 Vertex構造体を関数に渡すと、関数はコピーを取得し、頂点構造体は決して変更されません。 *頂点を渡すと、基本頂点が変更される可能性があります。これは、またはあなたの意図ではないかもしれないかもしれません:)

2

TL; DRは差はありません。変数がスタックまたはヒープに割り当てられるかどうかは、その使用方法によって異なります。

私はアセンブリの様々な初期化と呼び出しの場合から生成するにはdeep diveでした。 vbの間に生成されたアセンブリはほとんど同じです。特に、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になります。私は、あなたが聞きたいと思っていた疑問に答えるためにちょっと騙しました。

関連する問題