试图减少GC收集

Cha*_*eck 2 c# clr garbage-collection

有人可以告诉我下面的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;
        }
    }
}
Run Code Online (Sandbox Code Playgroud)

Gro*_*roo 6

如果Vec2 struct在两个示例中都是一个,通过使用Vec2 v = new Vec2();创建对结构的引用,您只需在堆栈上创建一个新结构.如果不使用该new关键字,则仍会在堆栈上创建结构,并且可以单独初始化每个字段.

在这种情况下,new如果构造函数不接受一些有意义的参数来在一行中初始化数据,那么对结构使用关键字没有多大意义.

如果第一种方法使用a class而不是a struct,那么它确实会为GC收集一个对象,这与第二种方法不同.由于v in AddB是在堆栈上分配的,因此不会收集它,只需在方法完成时弹出堆栈.