TL; DR没有区别。是否在堆栈或堆上分配变量取决于其用法。
我做了一个deep dive上的程序集生成从各种初始化和调用情况。在v
和b
之间生成的程序集几乎相同。特别值得注意的是,d
未被分配到堆栈。
什么决定了变量是堆分配还是堆分配是它的使用方式。将传递指针传递给仅将该参数用作值的函数不会强制变量被堆分配。但即使这并不能保证,该规范允许任何Go编译器根据需要在堆栈和堆之间自由移动变量以进行优化或代码生成。正如C/C++抽象掉RAM vs Register一样,去abstracts away Heap vs Stack。
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)
已经代替将是真实的。我骗了一些回答我认为你应该问的问题。