.NET内存消耗问题

.NET内存消耗问题,.net,memory-management,.net,Memory Management,这两种方法中的任何一种都比另一种使用更多的内存,还是给GC带来了更大的负载 选项1 选项2 这两种方法的堆内存使用是相同的。在第二种情况下,创建局部变量的开销很小,但这不会影响您。变量将存储在堆栈上,不会对GC造成任何额外压力。此外,编译器或JIT可能会优化此附加变量(因此它可能不会出现在CLR实际执行的代码中)。这两种方法的堆内存使用量相等。在第二种情况下,创建局部变量的开销很小,但这不会影响您。变量将存储在堆栈上,不会对GC造成任何额外压力。此外,编译器或JIT可能会优化此附加变量(因此它可

这两种方法中的任何一种都比另一种使用更多的内存,还是给GC带来了更大的负载

选项1

选项2


这两种方法的堆内存使用是相同的。在第二种情况下,创建局部变量的开销很小,但这不会影响您。变量将存储在堆栈上,不会对GC造成任何额外压力。此外,编译器或JIT可能会优化此附加变量(因此它可能不会出现在CLR实际执行的代码中)。

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

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

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

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


换句话说,这并不重要。您在运行时会得到完全相同的机器代码。

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


换句话说,这并不重要。您在运行时会得到完全相同的机器代码。

在发布模式下生成的代码不太可能有任何差异。JIT编译器几乎肯定会删除不必要的临时变量。在发布模式下生成的代码不太可能有任何差异。JIT编译器几乎肯定会删除不必要的临时变量。这只是一个中间步骤。是的,但是如果IL是相同的,那么代码将做完全相同的事情。虽然IL不是编译后的代码。这只是一个中间步骤。是的,但是如果IL是相同的,那么代码将做完全相同的事情。
LargeObject GetObject()
{
    return new LargeObject();
}
LargeObject GetObject()
{
    LargeObject result = new LargeObject();
    return result;
}