Pointers 什么';结构中指针和值的区别是什么?

Pointers 什么';结构中指针和值的区别是什么?,pointers,struct,go,Pointers,Struct,Go,给定以下结构: type Exp struct { foo int, bar *int } 在结构中使用指针或值时,性能方面的差异是什么。有没有开销,或者这只是两个围棋编程学校 我会使用指针来实现链式结构,但这是我们为了获得性能而必须在结构中使用指针的唯一情况吗 PS:在上面的结构中,我们讨论了一个简单的int,但它可以是任何其他类型(甚至是自定义类型)如果指针的大小小于结构成员,那么使用指针更有效,因为您不需要复制成员,只需复制其地址即可。此外,如果您希望能够移动或共享结构的某些部分

给定以下结构:

type Exp struct {
  foo int,
  bar *int
}
在结构中使用指针或值时,性能方面的差异是什么。有没有开销,或者这只是两个围棋编程学校

我会使用指针来实现链式结构,但这是我们为了获得性能而必须在结构中使用指针的唯一情况吗


PS:在上面的结构中,我们讨论了一个简单的int,但它可以是任何其他类型(甚至是自定义类型)

如果指针的大小小于结构成员,那么使用指针更有效,因为您不需要复制成员,只需复制其地址即可。此外,如果您希望能够移动或共享结构的某些部分,最好有一个指针,这样您也可以只共享成员的地址。另请参见。

使用对程序功能最有用的表单。基本上,这意味着如果值为
nil
,则使用指针

从性能角度来看,复制基元数值类型总是比取消引用指针更有效。即使是更复杂的数据结构,如果它们小于一两条缓存线(对于x86 CPU来说,小于128字节是一个很好的经验法则),通常复制速度也会更快

当事情变得越来越大时,如果性能与您有关,您需要进行基准测试。CPU在复制数据方面非常有效,而且涉及到许多变量,这些变量将决定数据的位置和缓存友好性,这实际上取决于程序的行为和使用的硬件

如果您想更好地理解内存和软件如何交互,这是一个优秀的系列文章:

简而言之,我告诉人们根据程序的逻辑选择指针与否,并担心以后的性能

  • 如果需要传递要修改的内容,请使用指针
  • 如果需要确定某些内容是否未设置/nil,请使用指针
  • 如果使用的类型具有指针接收器的方法,请使用指针

谢谢您的回答。当您谈到复制时,“使用指针更有效,因为您不需要复制成员,只需要复制其地址”,即使我们只使用Exp作为指针,也会是这样吗,即*Exp?此外,如果我们在Exp而不是*Exp类型上定义了一个方法,那么每次我们调用该方法时,您所说的关于副本的内容都适用,也就是说,调用该方法时有一个Exp的副本?(在阅读了fag关于方法定义的文章后,我想是的)。是的,每次都会复制一个type
Exp
参数。是的,如果有
Exp*
参数,则不会复制成员。指针允许您共享数据并紧凑地传递数据。使用指针可能会提高内存效率,但在各种情况下可能会表现更差,因为您正在丢失数据局部性。如果数据属于一个整体,并且经常一起访问,那么请将其保存在一起。我只想对您的优秀答案添加一个澄清:缺少第四个要点:“否则,不要使用指针,除非它能提供非常明显的性能改进”关于您的建议,如果您需要传递要修改的内容,请使用指针,在上面的示例中,foo和bar都可以修改,不是吗,尽管一个是指针,另一个不是?