.NET内存消耗问题

时间:2010-10-28 15:25:58

标签: .net memory-management

这些方法中的任何一种方法是否比其他方法使用更多内存或者在GC上使用更大的负载?

选项#1

LargeObject GetObject()
{
    return new LargeObject();
}

选项#2

LargeObject GetObject()
{
    LargeObject result = new LargeObject();
    return result;
}

3 个答案:

答案 0 :(得分:5)

两种方法的堆内存使用量相等。在第二种情况下创建局部变量的开销微乎其微,但它不应该打扰你。变量将存储在堆栈中,不会对GC造成任何额外压力。此附加变量也可能由编译器或JIT优化(因此它可能不会出现在CLR实际执行的代码中)。

答案 1 :(得分:3)

编译器将生成等同于代码版本2的IL,需要一个虚拟堆栈位置来存储对象引用。 JIT优化器将生成相当于代码版本1的机器代码,该引用存储在CPU寄存器中。

换句话说,没关系。您可以在运行时获得完全相同的机器代码。

答案 2 :(得分:1)

您可以查看生成的IL(使用反射器)并查看它是否完全不同。根据编译优化设置,#2可能会在堆栈上存储一个额外的值(对于result值),但这只会是额外的4或8个字节(如果它是一个类,它应该是! ),并且根本不会影响GC。