c# - 在循环内部与外部定义变量

标签 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;
}

最佳答案

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

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

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

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

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

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

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

关于c# - 在循环内部与外部定义变量,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/13883392/

相关文章:

c# - 如何在 C# 中创建 UDP 服务器?

c++ - 制作板的拷贝

matlab - 当 RAM 已满时中止 MATLAB 代码

c++ - 获取单个元素的大小或使用 operator new[] 分配的元素计数

java - 如何管理tomcat中的webapps足迹?

C#反编译

c# - 通用方法和无效上下文异常

c# - 在 ASP.NET 中获取域用户 ID

python - 这个for循环中是什么占用了内存?

java - 使用自动装箱的内存泄漏