您的位置:首页 > 其它

.NET中六个你必须知道的重要概念之堆栈(stack)和堆(heap)

2012-11-28 22:13 676 查看


当你声明一个变量时内存中都发生了什么?

  当你在一个.Net应用程序中声明一个变量时,首先要分配一些内存块到RAM,它包括三样东西,第一个是变量名,第二个是变量的数据类型,最后一个是变量的值。

  这只是一个很简单的解释,根据变量的数据类型不同,有两种内存分配类型:堆栈内存和堆内存。



图2 声明变量后的内存结构

  堆栈(stack)和堆(heap)

  为了帮助理解堆栈和堆,让我们了解下面的代码内部究竟发生了什么。

public void Method1()
{
// Line 1
int i=4;
// Line 2
int y=2;
//Line 3
class1 cls1 = new class1();
}


  这个方法内部只有三行代码,下面我就逐行解释内部发生了什么事情。

  第一行:执行该行时,编译器分配一小块叫做堆栈的内存,堆栈负责保持跟踪应用程序运行需要的内存。

  第二行:现在执行移动到下一步,正如堆栈的名称所暗示的那样,这个内存分配时叠放在前一个内存分配顶部的,你可以将堆栈理解为一系列隔间或盒子的逐层堆积。

  内存分配和解除分配使用LIFO(Last in first out,后进先出)逻辑,换句话说就是内存是在内存的末尾(如堆栈的顶部)分配和解除分配的。

  第三行:在第三行我们创建了一个对象,执行该行时,它在堆栈上创建一个指针,真实的对象是存储一个不同类型的内存分配(叫做堆)中,堆不会跟踪运行的内存,它只是对象的堆积,堆用于动态内存分配。

  退出方法(有趣):执行完最后一行代码后就该退出这个方法了,当它传递结束控制时,它就会清除分配到堆栈上的所有内存变量,换句话说就是所有与int数据类型关联的变量按照LIFO方式从堆栈中解除分配。

  但不会解除堆内存分配,这部分内存要通过GARBAGE COLLECTOR(垃圾回收器)解除分配。

内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: 
相关文章推荐