gpt4 book ai didi

xna - 这个样本会产生垃圾吗?

转载 作者:行者123 更新时间:2023-11-30 19:46:18 25 4
gpt4 key购买 nike

public class Foo
{
public void Draw() // Called 60 times per second
{
spriteBatch.Draw(new Vector2(x, y), null, Color.White);
}

private float x, y;
}

特别是,我想知道 new Vector2(x, y) 调用是否产生垃圾。

我的理解是,由于Vector2 是一个 类型,并且没有作为引用 类型的成员存储,它将在堆栈上创建。因此,它的内存应该在 Draw 方法返回时自动回收,不会产生垃圾。

对吗?


编辑

如果我可以要求进一步澄清 Eric Lippert 的初始帖子。

问题 1)

It depends on whether the first formal parameter of the invoked function takes a reference type or the value type. If it takes the value type then no, there is no garbage generated here. If it takes a reference type then the value will be boxed.

那么如果签名恰好是这样的:

public void Draw()
{
Vector2 vector = new Vector2(x, y);
spriteBatch.Draw(ref vector, null, Color.White);
}

它会从被装箱的向量中产生垃圾吗?

问题 2)

Just because it is not on the heap does not logically entail that it is generated on the stack. It could be in a register.

但我假设从垃圾收集器的角度来看,存储在寄存器中的行为就像存储在堆栈中一样。对吗?

最佳答案

I am wondering if the new Vector2(x, y) call is generating garbage or not.

这取决于被调用函数的第一个形参是引用类型还是值类型。如果它采用值类型则否,这里没有产生垃圾。如果它采用引用类型,则该值将被装箱。

My understanding is that since Vector2 is a value type, and is not being stored as a member of a reference type, it will be created on the stack

仅仅因为它不在堆上并不逻辑上意味着它是在堆栈上生成的。它可能在寄存器中。

if the signature required passing the struct "by ref" (using "ref" or "out" modifiers) would there be any boxing?

没有。您正在混淆两种引用。 变量别名的“引用”不是对象:

void D(int q) {}
void D(ref int q) {}
void D(object q) {}

第一个方法 D 获取一个整数的副本。第二个 D 为包含未装箱整数的变量创建别名。第三个 D 取一个盒装整数。

I assume being stored in a register would behave like being stored in the stack from the garbage collector point of view.

这不是一个有效的假设。假设注册或放置在堆栈上的值包含对垃圾收集对象的引用。抖动有权以不同于堆栈引用的方式处理注册引用。例如,假设抖动的寄存器分配算法决定在抖动知道引用将不再被取消引用后重新使用该寄存器用于其他用途。抖动是完全自由的,然后告诉垃圾收集器引用已经消失了。通过这样做,即使对象的方法正在执行,“this”也可能被 GC 线程释放

抖动当然也可以通过堆栈来实现,但那将是一个更积极的优化。

关于xna - 这个样本会产生垃圾吗?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/8793525/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com