Go 是否将结构初始化为指针

Go 是否将结构初始化为指针,go,Go,这两种初始化顶点的方法有何不同 我知道第二种方法是使用指针分配,但在实践中我看不出这种方法有什么不同。在这两种情况下,顶点结构的初始化方式相同 第一个表达式返回的值是初始化的顶点结构。使用6g的对齐规则,这意味着您将获得相当于8+8=16字节的顶点结构,因为每个float64的大小为8字节。 第二个表达式分配足够8+8=16字节的内存,将其用作顶点结构,对其进行初始化并返回一个指针,该指针的大小将为4或8字节,具体取决于您的体系结构 在实践中有许多不同之处。顶点结构和*顶点指针这两个值的方法集可

这两种初始化
顶点的方法有何不同


我知道第二种方法是使用指针分配,但在实践中我看不出这种方法有什么不同。

在这两种情况下,顶点结构的初始化方式相同

第一个表达式返回的值是初始化的顶点结构。使用6g的对齐规则,这意味着您将获得相当于8+8=16字节的顶点结构,因为每个float64的大小为8字节。 第二个表达式分配足够8+8=16字节的内存,将其用作顶点结构,对其进行初始化并返回一个指针,该指针的大小将为4或8字节,具体取决于您的体系结构


在实践中有许多不同之处。顶点结构和*顶点指针这两个值的方法集可能不同。根据需要传递顶点结构的频率,传递指向顶点结构的指针可能更有效,也可能不更有效。如果将顶点结构传递给函数,该函数将获得一个副本,并且永远不会修改顶点结构。如果传递*顶点,则可能会更改基础顶点。这可能是你的意图,也可能不是:)

TL;DR没有区别1。是否在堆栈或堆上分配变量取决于其使用情况

我对从各种初始化和调用案例生成的程序集进行了分析。在
v
b
之间生成的程序集几乎相同。需要特别注意的是,
d
未在堆栈1上分配

决定变量是堆分配还是堆栈分配的是它的使用方式。将指针传递给只使用参数作为值的函数不会强制堆分配变量。但即使这样也不能保证,该规范允许任何Go编译器根据优化或代码生成的需要在堆栈和堆之间自由移动变量。就像C/C++抽象出RAM和寄存器一样

1:技术上不正确,但如果使用了
fmt.Println(*d)
,则为正确。为了回答你想问的问题,我骗了你一点

type Vertex struct {
    X, Y float64
}

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

    d := &Vertex{3, 4}
    fmt.Println(d)
}
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)
}