这些方法中的任何一种方法是否比其他方法使用更多内存或者在GC上使用更大的负载?
选项#1
LargeObject GetObject()
{
return new LargeObject();
}
选项#2
LargeObject GetObject()
{
LargeObject result = new LargeObject();
return result;
}
答案 0 :(得分:5)
两种方法的堆内存使用量相等。在第二种情况下创建局部变量的开销微乎其微,但它不应该打扰你。变量将存储在堆栈中,不会对GC造成任何额外压力。此附加变量也可能由编译器或JIT优化(因此它可能不会出现在CLR实际执行的代码中)。
答案 1 :(得分:3)
编译器将生成等同于代码版本2的IL,需要一个虚拟堆栈位置来存储对象引用。 JIT优化器将生成相当于代码版本1的机器代码,该引用存储在CPU寄存器中。
换句话说,没关系。您可以在运行时获得完全相同的机器代码。
答案 2 :(得分:1)
您可以查看生成的IL(使用反射器)并查看它是否完全不同。根据编译优化设置,#2可能会在堆栈上存储一个额外的值(对于result
值),但这只会是额外的4或8个字节(如果它是一个类,它应该是! ),并且根本不会影响GC。