3

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

注意: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;
}
4

3 回答 3

4

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

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

似乎需要两个存储位置,但编译器可以看到第一个永远不会在第一个范围之外使用,并且可以将位置重新用于 b。

它还可以看到它可以完全取消堆栈存储并在寄存器中执行整个操作。

无论是否循环,单个变量声明都定义了一个存储位置。永远不会为循环的每次迭代创建一个新的存储位置。

一般来说,这不是您需要关心的事情。

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

于 2012-12-14T17:27:48.357 回答
0

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

于 2012-12-14T17:25:49.197 回答
0

正确的判断方法是反汇编,看代码。您会看到对每个的引用。

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

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

于 2012-12-14T17:28:24.377 回答