堆和栈的含义,值类型和引用类型 值类型和引用类型,栈和堆的含义

   本文主要是讨论栈和堆的含义,也就是C#的两种类据类型:值类型和引用类型;

 1、堆与栈

  •   什么是堆(Heap)?

☞   堆是无序的,是一片不连续的内存域,由用户本身来控制和释放,若是用户本身不释放的话,当内存达到必定的特定值时或程序运行结束时,经过垃圾回收器(GC)来回收。html

☞   是程序运行期间动态分配的内存空间,你能够根据程序的运行状况肯定要分配的堆内存的大小。post

  •   什么是栈(Stack)?

☞   栈是有顺序的,是一片连续的内存域,保持着先进后出的原则,由系统自动分配和维护。url

☞   是编译期间就分配好的内存空间,所以代码中必须就栈的大小有明确的定义。spa

      即, 所分配的内存是在一块连续的内存区域内.当咱们声明变量时,那么编译器会自动接着当前栈区的结尾来分配内存。.net

 二、值类型与引用类型

  •   概念:值类型直接存储其值在线程栈中,引用类型存储对其值的引用。部署:托管堆上部署了全部引用类型。这里须要指出一点:若是一个引用类型中的某个属性是值类型,这个值类型的属性是分配在托管堆上的。
  •   引用类型:基类为Objcet
  •   值类型:均隐式派生自System.ValueType;
  •   值类型与引用类型表:

  • 内存分配             

☞  值类型变量声明后,不管是否已经赋值,编译器都会为其分配内存。线程

☞  引用类型当声明一个类时,只会在栈中分配一小块内存用于存放引用地址,此时并无为其分配堆上的空间。当类实例化时,分配内存空间,并把堆上空间的地址保存到栈上分配的小块空间中。3d

☞  值类型的实例一般是在线程栈上分配的(静态分配),可是在某些情形下能够存储在堆中。htm

☞  引用类型的对象老是在进程堆中分配(动态分配)。对象

  • 示例代码

 

运行结果blog

 

   

从图中咱们能够看出,两个引用类型sc1,sc2都指向同一个托管堆上的空间,因此最后一个指向的会覆盖掉前面的。

而结构是值类型,虽然使用sv2=sv1,把sv1对象赋值给sv2,可是它会在线程栈中分配一个独立的空间,当修改某一个对象的值的时候,不会影响到另外一个对象 

因此,值类型和引用类型的区别就是:

            一、它们存储的位置不同

            二、若是是引用类型,当两个对象指向同一个地方,修改某一个的时候,其它对象的值会发生改变

 

内容参考来自文章:

值类型和引用类型,栈和堆的含义

C#详解值类型和引用类型区别

   

  做者:遥远的Ta

相关文章
相关标签/搜索