TL; DR Non c'è differenza . Se una variabile è allocata nello stack o nell'heap dipende dal suo utilizzo.
Ho eseguito un deep dive sull'assembly Go generato da vari casi di inizializzazione e chiamata. L'assemblaggio generato tra v
e b
è quasi lo stesso. Di particolare nota, d
non è allocato nello stack .
Che cosa determina se una variabile è allocata su un heap o se lo stack allocato è il modo in cui viene utilizzato. Passare il passaggio di un puntatore a una funzione che ha utilizzato solo il parametro come valore non impone l'allocazione dell'heap a una variabile. Ma anche questo non è garantito, la specifica consente a qualsiasi compilatore di Go di spostare liberamente le variabili tra lo stack e l'heap come necessario per l'ottimizzazione o la generazione del codice. Vai a abstracts away Heap vs Stack proprio come C/C++ asporta via RAM vs Register.
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)
}
: tecnicamente non è vero, ma sarebbe vero se fmt.Println(*d)
era stato usato al posto. Ho barato un po 'per rispondere alla domanda che pensavo avresti voluto chiedere.
fonte
2013-10-18 05:59:54