• 深入理解.NET中的堆和栈的区别
  • Cvlrt 发表于 2016/2/18 11:51:00 | 分类标签: .NET 堆和栈
  • 现在越来越觉得对.NET基本概念的理解和掌握对于提升编程水平的重要性,先从.NET的 Stack(栈)和Heap(堆)说起,计算机的内存可以分为代码块内存,stack内存和heap内存。代码块内存是在加载程序时存放程序机器代码的地方。Stack一般存放函数内的局部变量。而heap存放全局变量和类对象实例等。若只是声明一个对象,则先在栈内存中为其分配地址空间,若再实例化它,则在堆内存中为其分配空间。

    1 Stack VS Heap

    由于计算机的内存分配过程比较抽象,下面举一个简单的程序片段,来图解和谐步骤对Stack和Heap内存的影响:

     下面的StackvsHeap类有一个Person类和Fun1方法,当调用Fun1方法时,当执行第一行代码,即

    int i=3;

    在.NET中,除了string、object、class、delegate和interface外,其他的类型为数值类型,一般(不是全部)存放在Stack内存中。此处int i=3是函数内的非静态变量,而数值型为非引用类型,即会在Stack内存中分配一个区域来存放该变量的名和值。

    当执行第二句语句,即

    int j=i;

      .NET也会在Stack内存中分配一个区域来存放该变量的名和值。而且地址块在i=3之上(LIFO)。

      当执行第三句,即

     Person p = new Person();

    时,我们可以分为两步来看:

      1)在Stack上分配一个Person类型的p引用变量(指向Heap上的地址);

      2) 在Heap上分配一个空间来存储Person类的实例数据;

      具体的过程如下图所示:

    2 值类型和引用类型

     理解了上面的过程,现在理解值类型和引用类型的变量则更加容易:

     先看下面的图: 

    由于int j=i中是int类型,为值类型变量,则j=3为i=3的拷贝,因此,修改i不会修改j,修改j也不会修改i;

    而Person p2=p中Person为类,是引用类型,因此p2和p指向同一个heap地址块,因此,修改p2的值会影响p的值。

  • 请您注意

    ·自觉遵守:爱国、守法、自律、真实、文明的原则

    ·尊重网上道德,遵守《全国人大常委会关于维护互联网安全的决定》及中华人民共和国其他各项有关法律法规

    ·严禁发表危害国家安全,破坏民族团结、国家宗教政策和社会稳定,含侮辱、诽谤、教唆、淫秽等内容的作品

    ·承担一切因您的行为而直接或间接导致的民事或刑事法律责任

    ·您在编程中国社区新闻评论发表的作品,本网站有权在网站内保留、转载、引用或者删除

    ·参与本评论即表明您已经阅读并接受上述条款

  • 感谢本文作者
  • 作者头像
  • 昵称:Cvlrt
  • 加入时间:2013/5/22 0:00:00
  • TA的签名
  • 这家伙很懒,虾米都没写
  • +进入TA的空间
  • 以下内容也很赞哦
分享按钮