C# 中堆与栈的浅记
C# 中堆与栈的浅记
什么是堆和栈?
简言之。堆和栈是驻留在内存中的区域,它们的作用是帮助我们运行代码。在.Net Framework 环境下,当我们的代码运行时,内存中的堆和栈便存储了这些代码,并包括了代码运行所须要的所有信息。
这样说来还是有些抽象。那么,在堆和栈中到底都保存了些什么呢?概括说来就是四类数据:
1、值类型数据
2、引用类型数据
3、指针
4、指令
以下对上述四类数据做以简介。我们知道,C#中的数据类型分为两种。各自是值类型和引用类型。
值类型数据直接在内存中的一个位置存储它们自身的内容(值)。引用类型数据在内存中的一个位置存储指向内存中其他某个位置的地址,而在这个地址所指的位置中存储内容(值)。
对于指针。我们在.Net Framework环境中不会显示的使用指针,它们由CLR来管理。指针本身就是一个内存地址,它指向还有一个内存位置。
它的值就是一个内存地址或者为空(null)。
指令指的就是运行该方法的指令,当方法运行时须要在栈上为之分配空间。
那么,上述四类数据在堆与栈中是怎样分配存储的?或者我们还能够把关心的范围再缩小一下,值类型数据与引用类型数据,它们是怎样分配的?
规则:
1、引用类型数据总是存放在堆中;
2、值类型数据假设在方法体中被声明。那么它将存放在栈上;假设它作为引用类型的成员被声明。那么它将存放在堆中。
结合上面的两条规则,让我们分别来看一下堆与栈的不同之处。
在内存中,栈负责保存代码运行的路径(调用路径)。当我们的代码開始调用一个方法时,首先将放置一段编码指令到栈上,接下来再放置方法的參数。然后当代码运行到方法体中声明变量的位置,这些变量将被进栈至栈顶(注意。这里指的是值类型数据。第一种情况)。截止到这里,在方法体中被声明的值类型数据。它们被存放在了栈上。当方法运行完毕,方法的结果被返回,此时全部在栈上的该方法所使用的内存空间都被清空,程序将自己主动回到栈上最初方法调用的位置。
这也告诉了我们一点。栈是自行维护的,内存自己主动维护栈,不存在垃圾回收问题。
另外一种情况,当代码运行到在方法体中被声明的引用类型数据的位置。引用类型数据将在堆上被创建。与此同一时候在栈上生成一个指向这个堆的指针,这个指针就存放在栈上。当方法运行结束后。栈上的相关信息被清除,可是,此时将剩下孤独的引用类型数据參数在堆中。这就是垃圾回收产生的原因。
注意,垃圾回收是很耗费性能的。这就是为什么我们要特别注意栈和堆的使用的原因。
以上内容是自己对于C#之中堆与栈的一个基本而又浅显的理解。兴许还会继续深入思考。继续挖掘堆与栈的内容。
C# 中堆与栈的浅记的更多相关文章
- 转载:C++中堆和栈的区别
C++中堆和栈的区别,自由存储区.全局/静态存储区和常量存储区 文章来自一个论坛里的回帖,哪个论坛记不得了! 在C++中,内存分成5个区,他们分别是堆.栈.自由存储区.全局/静态存储区和 ...
- C/C++中堆与栈
本文介绍C/C++中堆,栈及静态数据区. 五大内存分区 在C++中,内存分成5个区,他们分别是堆.栈.自由存储区.全局/静态存储区和常量存储区.下面分别来介绍: 栈,就是那些由编译器在需要的时候分 ...
- Java中堆和栈的区别(转)
栈与堆都是Java用来在Ram中存放数据的地方.与C++不同,Java自动管理栈和堆,程序员不能直接地设置栈或堆. Java的堆是一个运行时数据区,类的对象从中分配空间.这些对象通过new. ...
- C语言中堆和栈的区别
原文:http://blog.csdn.net/tigerjibo/article/details/7423728 C语言中堆和栈的区别 一.前言: C语言程序经过编译连接后形成编译.连接后形成的二进 ...
- 【转载】c++中堆、栈内存分配
一.内存划分 1.栈区(stack)— 由编译器自动分配释放 ,存放函数参数值,局部变量值等.其操作方式类似于数据结构中栈.2.堆区(heap) — 一般由程序员分配释放, 若程序员不释放,程序结束时 ...
- C++中堆和栈的完全解析
C++中堆和栈的完全解析 内存分配方面: 堆: 操作系统有一个记录空闲内存地址的链表,当系统收到程序的申请时,会遍历该链表,寻找第一个空间大于所申请空间的堆结点,然后将该结点从空闲结点链表中删 除,并 ...
- C中堆和栈的区别
C++中堆和栈的完全解析 内存分配方面: 堆: 操作系统有一个记录空闲内存地址的链表,当系统收到程序的申请时,会遍历该链表,寻找第一个空间大于所申请空间的堆结点,然后将该结点从空闲结点链表中删 除,并 ...
- Java 中堆和栈有什么区别?
JVM 中堆和栈属于不同的内存区域,使用目的也不同.栈常用于保存方法帧和局 部变量,而对象总是在堆上分配.栈通常都比堆小,也不会在多个线程之间共享, 而堆被整个 JVM 的所有线程共享.
- c++中堆、栈内存分配
转自:https://blog.csdn.net/qingtingchen1987/article/details/7698415 一个由C/C++编译程序占用内存分为以下几个部分1.栈区(stack ...
随机推荐
- 2017 SCNUCPC 解题报告
校内赛题目.解题思路.参考代码一览 A. Blackstorm's Blackstore Problem Description Blackstorm is going to open a black ...
- Apex简介
Apex特点 Salesforce为开发者提供了Apex语言.它是一种语法上类似于Java的编程语言,有以下特点: 面向对象 完全在云端处理,包括保存.编译.执行 强类型 大小写不敏感(这一点和其他大 ...
- MySQL数据库导入错误:ERROR 1064 (42000) 和 ERROR at line xx: Unknown command '\Z'.
使用mysqldump命令导出数据: D:\Program Files\MySQL\MySQL Server 5.6\bin>mysqldump -hlocalhost -uroot -proo ...
- git下载、安装、连接github
0.下载git 官网下载速度慢,下载不下来阿里云下载地址:https://npm.taobao.org/mirrors/git-for-windows/ 1.安装git linux:在命令行直接输入: ...
- C# JObject和JArray 的分享
最近在调用别人的搜索引擎接口时遇到了一种返回类型为数组的情况,如 { "result": [ //根据用户输入搜索匹配到的标题数组 "我是一条新 ...
- [20170825]11G备库启用DRCP连接3.txt
[20170825]11G备库启用DRCP连接3.txt --//昨天测试了11G备库启用DRCP连接,要设置alter system set audit_trail=none scope=spfil ...
- 08-OpenLDAP主机控制策略
OpenLDAP主机控制策略 阅读视图 参考 环境准备 openldap服务端配置 openldap客户端配置 客户端测试登录 故障处理 1. 参考 本文基本转载博客openldap主机访问控制(基于 ...
- 用Python实现数据结构之树
树 树是由根结点和若干颗子树构成的.树是由一个集合以及在该集合上定义的一种关系构成的.集合中的元素称为树的结点,所定义的关系称为父子关系.父子关系在树的结点之间建立了一个层次结构.在这种层次结构中有一 ...
- mybatis 相关
一.mybatis转义问题 mybatis中SQL在 mapper.xml 中书写时,如果有 < .>.<=.>= 时会出错,应该使用转义的写法. 写法一 转义 < ...
- 彻底卸载删除Win10易升,禁止再生
易升是微软推出的win10升级工具.用户可通过易升一键升级win10. 因为我的电脑已经是win10的系统,所以我也不需要升级.也不想升级,因为我从网上了解到升级后的系统反而没有升级前的好用. 微软的 ...