Go 值(非指针)上的``接收器是否仍复制该值?
我的问题是,在Go 值(非指针)上的``接收器是否仍复制该值?,go,Go,我的问题是,在\uuu是接收者的情况下调用方法时,是否生成值的副本 type Foo struct { // Many fields, making a large struct } func (_ Foo) Test(v *T) int { // Here we can't use the receiver but the method is still needed } 因此,我想知道当调用Test()时,Go实现是否仍会复制Foo值,即使不可能实际改变接收器值 var f Fo
\uuu
是接收者的情况下调用方法时,是否生成值的副本
type Foo struct {
// Many fields, making a large struct
}
func (_ Foo) Test(v *T) int {
// Here we can't use the receiver but the method is still needed
}
因此,我想知道当调用Test()
时,Go实现是否仍会复制Foo
值,即使不可能实际改变接收器值
var f Foo
f.Test() // Is this making a copy?
我还想知道指针的情况,默认情况下会自动取消引用
var f = new(Foo)
f.Test() // Is this making a copy?
我试着看了看装配图,我想它可能是在复制,但我只是不太确定
详情如下: 这是一个奇怪的情况,我不能使用指针。代码是机器生成的,在对
v
参数进行初始化时,需要使类型实现接口。(生成的代码包含关于Foo
的元数据,该元数据在v
上设置)
因此,如果我将接收器设为指针,则“value”实例将无法实现接口。此方法将为每个实例调用一次,并且实例有时可能很大和/或创建的数量很大,这就是我希望避免不必要的复制的原因。根据,调用者为返回值分配堆栈元素,被调用者填充它们
这让我相信这个值是被复制然后被丢弃的
如果receiver可以通过生成一个巨大的接收器类型(
type hugh[1e5]int
或其他任何类型)来进行检查,调用像您这样的方法一百万次,则必须生成该被调用方或专门的被调用方,看它是否比用较小的接收器类型做同样的事情要慢得多。GC工具链并不优化用空白标识符来命名参数的情况。除非我有时间检查程序集并查看实际的差异,否则我将删除我的答案,因为~4ns的节省量小于任何实际工作的统计噪声。一般来说,CPU的复制速度非常快,所以除非您的结构非常大,否则不必担心这一点。在这种情况下,只需使用一个指针,因为如果不取消对它的引用,就不会支付查找费用。@JimB,MuffinTop,Two:谢谢。这是一个奇怪的情况,我不能使用指针。代码是机器生成的,需要在对v
参数进行初始化时实现接口。(生成的代码包含关于Foo
的元数据,该元数据在v
上设置),因此如果我将其设置为指针,则值实例将无法实现该接口。这将为每个实例调用一次,并且有时可以创建大量实例。所以这是一个不寻常的情况,让我今天来到这里。:-。。。如果结果是一个问题,我可能只需要解析目标代码并确定它是否足够大,是否需要一个指针。不过,如果能看到它得到优化,那就太好了。谢谢,是的,从测试中确实可以看出该值确实被复制了。似乎是一个安全的优化,以避免复制,但由于这是一个不寻常的情况,这并不奇怪,我太多的优化不存在。