c# - 尝试减少 GC 收集

标签 c# garbage-collection clr

有人可以告诉我下面的 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/

相关文章:

c# - Resharper:在调试期间显示表达式值

c# - 具有静态成员的未引用对象的 .NET GC

java - 作为 Java 程序入口点的对象是否被垃圾收集?

c++ - 如何制作 C++ native 项目的 CLI/C++ 包装器

c# - 如何使用 jQuery 禁用按钮,但在单击按钮后运行服务器代码?

c# - 创建日志文件C#

c# - 如何在我的自定义类上使用 IDisposable?

Java - 并发标记清除 GC 中的标记/未标记对象

c# - 在 app.config 中使用 <rollForwardenabled ="true"/>

c# - 用于大型代码库的 C# 编译器是否会在具有巨大 RAM 的机器上运行得更快?