在循环内部和外部定义变量

时间:2012-12-14 17:19:34

标签: c# memory memory-management

我想知道在每一个循环代码中,某个版本是否比第二个版本消耗更少的内存,如果在某些版本中我们为每个循环周期中的变量分配了新空间,那是真的。

注意:2很明显,1和3更有趣..

1

While(!exit)
{
  int x = 5;
}

对战:

int x= 0;
While(!exit)
{
  x = 5;
}

参考类型的相同问题: 的 2

While(!exit)
{
      Point p = new Point();
      p.x = 5;
}

对战:

Point p = new Point();
While(!exit)
{
      p.x = 5;
}

第3 即可。没有分配的参考类型类似于1?:

While(!exit)
{
      Point p = point1;
}

对战:

Point p = null;
While(!exit)
{
   p = point1;
}

3 个答案:

答案 0 :(得分:4)

编译器决定您的函数需要多少堆栈存储位置,并将尽其所能减少这种需求。类似的东西:

{
   int a;
   ...
}
{
   int b;
   ...
}

似乎需要两个存储位置,但编译器可以看到第一个从未在第一个范围之外使用,并且可以重新使用b的位置。

它也可能看到它可以一起消除堆栈存储并在寄存器中执行整个操作。

无论循环与否,单个变量声明定义单个存储位置。永远不会出现为循环的每次迭代创建新存储位置的情况。

一般来说,这不是你需要关注的事情。

请注意,“debug”构建可能会在堆栈上为声明的每个变量生成单独的存储位置,以便在调试时更容易查看这些变量。

答案 1 :(得分:0)

没关系。编译器对其进行优化,因此它保持不变。在C#等编译语言中,它不应该影响性能。例如,在Java中,最好只声明一次。

答案 2 :(得分:0)

正确的方法是拆解它,然后查看代码。你会看到对每个人的引用。

链接到MSDN的方式:http://msdn.microsoft.com/en-us/library/f7dy01k1.aspx

代码在CIL中非常易读。只需搜索功能名称,您就会看到对new等的调用。

相关问题