C# 中堆与栈的浅记

什么是堆和栈?

简言之。堆和栈是驻留在内存中的区域,它们的作用是帮助我们运行代码。在.Net Framework 环境下,当我们的代码运行时,内存中的堆和栈便存储了这些代码,并包括了代码运行所须要的所有信息。

这样说来还是有些抽象。那么,在堆和栈中到底都保存了些什么呢?概括说来就是四类数据:

1、值类型数据

2、引用类型数据

3、指针

4、指令

以下对上述四类数据做以简介。我们知道,C#中的数据类型分为两种。各自是值类型和引用类型。

值类型数据直接在内存中的一个位置存储它们自身的内容(值)。引用类型数据在内存中的一个位置存储指向内存中其他某个位置的地址,而在这个地址所指的位置中存储内容(值)。

对于指针。我们在.Net Framework环境中不会显示的使用指针,它们由CLR来管理。指针本身就是一个内存地址,它指向还有一个内存位置。

它的值就是一个内存地址或者为空(null)。

指令指的就是运行该方法的指令,当方法运行时须要在栈上为之分配空间。

那么,上述四类数据在堆与栈中是怎样分配存储的?或者我们还能够把关心的范围再缩小一下,值类型数据与引用类型数据,它们是怎样分配的?

规则:

1、引用类型数据总是存放在堆中;

2、值类型数据假设在方法体中被声明。那么它将存放在栈上;假设它作为引用类型的成员被声明。那么它将存放在堆中。

结合上面的两条规则,让我们分别来看一下堆与栈的不同之处。

在内存中,栈负责保存代码运行的路径(调用路径)。当我们的代码開始调用一个方法时,首先将放置一段编码指令到栈上,接下来再放置方法的參数。然后当代码运行到方法体中声明变量的位置,这些变量将被进栈至栈顶(注意。这里指的是值类型数据。第一种情况)。截止到这里,在方法体中被声明的值类型数据。它们被存放在了栈上。当方法运行完毕,方法的结果被返回,此时全部在栈上的该方法所使用的内存空间都被清空,程序将自己主动回到栈上最初方法调用的位置。

这也告诉了我们一点。栈是自行维护的,内存自己主动维护栈,不存在垃圾回收问题。

另外一种情况,当代码运行到在方法体中被声明的引用类型数据的位置。引用类型数据将在堆上被创建。与此同一时候在栈上生成一个指向这个堆的指针,这个指针就存放在栈上。当方法运行结束后。栈上的相关信息被清除,可是,此时将剩下孤独的引用类型数据參数在堆中。这就是垃圾回收产生的原因。

注意,垃圾回收是很耗费性能的。这就是为什么我们要特别注意栈和堆的使用的原因。

以上内容是自己对于C#之中堆与栈的一个基本而又浅显的理解。兴许还会继续深入思考。继续挖掘堆与栈的内容。

C# 中堆与栈的浅记的更多相关文章

  1. 转载:C++中堆和栈的区别

    C++中堆和栈的区别,自由存储区.全局/静态存储区和常量存储区     文章来自一个论坛里的回帖,哪个论坛记不得了!    在C++中,内存分成5个区,他们分别是堆.栈.自由存储区.全局/静态存储区和 ...

  2. C/C++中堆与栈

    本文介绍C/C++中堆,栈及静态数据区.   五大内存分区 在C++中,内存分成5个区,他们分别是堆.栈.自由存储区.全局/静态存储区和常量存储区.下面分别来介绍: 栈,就是那些由编译器在需要的时候分 ...

  3. Java中堆和栈的区别(转)

    栈与堆都是Java用来在Ram中存放数据的地方.与C++不同,Java自动管理栈和堆,程序员不能直接地设置栈或堆.      Java的堆是一个运行时数据区,类的对象从中分配空间.这些对象通过new. ...

  4. C语言中堆和栈的区别

    原文:http://blog.csdn.net/tigerjibo/article/details/7423728 C语言中堆和栈的区别 一.前言: C语言程序经过编译连接后形成编译.连接后形成的二进 ...

  5. 【转载】c++中堆、栈内存分配

    一.内存划分 1.栈区(stack)— 由编译器自动分配释放 ,存放函数参数值,局部变量值等.其操作方式类似于数据结构中栈.2.堆区(heap) — 一般由程序员分配释放, 若程序员不释放,程序结束时 ...

  6. C++中堆和栈的完全解析

    C++中堆和栈的完全解析 内存分配方面: 堆: 操作系统有一个记录空闲内存地址的链表,当系统收到程序的申请时,会遍历该链表,寻找第一个空间大于所申请空间的堆结点,然后将该结点从空闲结点链表中删 除,并 ...

  7. C中堆和栈的区别

    C++中堆和栈的完全解析 内存分配方面: 堆: 操作系统有一个记录空闲内存地址的链表,当系统收到程序的申请时,会遍历该链表,寻找第一个空间大于所申请空间的堆结点,然后将该结点从空闲结点链表中删 除,并 ...

  8. Java 中堆和栈有什么区别?

    JVM 中堆和栈属于不同的内存区域,使用目的也不同.栈常用于保存方法帧和局 部变量,而对象总是在堆上分配.栈通常都比堆小,也不会在多个线程之间共享, 而堆被整个 JVM 的所有线程共享.

  9. c++中堆、栈内存分配

    转自:https://blog.csdn.net/qingtingchen1987/article/details/7698415 一个由C/C++编译程序占用内存分为以下几个部分1.栈区(stack ...

随机推荐

  1. sqlserver每行都有累加,你怎么搞,窗口函数来帮忙!!!

          在统计中我们经常会面临复杂的查询,例如累加,最近也遇到一个很好的例子,今天我们一起来看看:       有一个关于销售数据的视图,字段有:emptyid(员工编号),ordermonth( ...

  2. input 输入框 change 事件和 blur 事件

    输入框的 change 和 blur  事件绝大多数情况下表现是一致的,输入结束后离开输入框会先后触发 change 和 blur.那么这两个事件的区别在哪呢? 当文本框获得焦点后,没有输入任何内容, ...

  3. mooc《数据结构》 习题1.8 二分查找

    本题要求实现二分查找算法. 函数接口定义: Position BinarySearch( List L, ElementType X ); 其中List结构定义如下: typedef int Posi ...

  4. Jmeter进阶篇之逻辑控制器

    最近,遇到了一个困扰很多人的问题.情景如下: 业务流程:登录一个网站,反复进行充值. 通常的做法是使用jmeter对登录和充值的接口进行反复的执行: 但是实现的方法却不能完美的贴合业务流程.并且,在进 ...

  5. Salesforce小知识:累计汇总字段类型

    累计汇总字段类型的定义 Salesforce中可以在两个对象之间建立关系.一个对象的某一条记录可以有若干条相关联的其他对象记录. 累计汇总字段可以将这些相关联的记录中的某些字段值汇总起来,显示给用户. ...

  6. ​《数据库系统概念》4-DDL、集合运算、嵌套子查询

    一.DDLa) SQL Data DefinitionSQL的基本数据类型有char(n).varchar(n).int.smallint.numeric(p,d).real,double preci ...

  7. Java并发编程(十四)Java内存模型

    1.共享内存和消息传递 线程之间的通信机制有两种:共享内存和消息传递:在共享内存的并发模型里,线程之间共享程序的公共状态,线程之间通过写-读内存中的公共状态来隐式进行通信.在消息传递的并发模型里,线程 ...

  8. Collections工具类

    Collections 是一个操作 Set.List 和 Map 等集合的工具类. Collections 中提供了一系列静态的方法对集合元素进行排序.查询和修改等操作,还提供了对集合对象设置不可变. ...

  9. SolrCloud集群搭建(基于zookeeper)

    1. 环境准备 1.1 三台Linux机器,x64系统 1.2 jdk1.8 1.3 Solr5.5 2. 安装zookeeper集群 2.1 分别在三台机器上创建目录 mkdir /usr/hdp/ ...

  10. ER模型试题

    M公司为了便于开展和管理各项业务活动,提高公司的知名度和影响力,拟构建一个基于网络的会议策划系统. [需求分析结果] 该系统的部分功能及初步需求分析的结果如下 : (1)M公司旗下有业务部.策划部和其 ...