繁体   English   中英

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

[英]Defining a variable inside a loop vs outside

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

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

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

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

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

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

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

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

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

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

正确的方法是反汇编,然后查看代码。 你会看到每个引用。

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

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

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM