有人可以告诉我下面的 AddB 是否会导致比 AddA 更少的 CLR 分配?我已经检查了反汇编,看起来是这样,但我希望得到专家的确认。有人可以与我交换此信息吗?
干杯, 查理。
namespace A
{
struct Vec2
{
public float x;
public float y;
public Vec2 AddA(Vec2 other)
{
Vec2 v = new Vec2(); // Reference variable
v.x = x + other.x;
v.y = y + other.y;
return v;
}
public Vec2 AddB(Vec2 other)
{
Vec2 v; // Value variable
v.x = x + other.x;
v.y = y + other.y;
return v;
}
}
}
最佳答案
如果 Vec2 在两个示例中都是 struct
,则通过使用 Vec2 v = new Vec2();
您不会创建对你的结构,你只是在你的堆栈上创建一个新的结构。如果您不使用 new
关键字,您的结构仍然会在堆栈上创建,您可以单独初始化每个字段。
在那种情况下,如果您的构造函数不接受一些有意义的参数来在一行中初始化数据,则对结构使用 new
关键字没有多大意义。
如果第一种方法使用class
而不是struct
,那么它确实会创建一个对象供GC 收集,这与第二种方法不同。由于 AddB
中的 v 分配在堆栈上,因此不会被收集,堆栈会在您的方法完成时弹出。
关于c# - 尝试减少 GC 收集,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/919931/