惯性聚合 高效追踪和阅读你感兴趣的博客、新闻、科技资讯
阅读原文 在惯性聚合中打开

推荐订阅源

雷峰网
雷峰网
博客园 - 聂微东
酷 壳 – CoolShell
酷 壳 – CoolShell
宝玉的分享
宝玉的分享
奇客Solidot–传递最新科技情报
奇客Solidot–传递最新科技情报
罗磊的独立博客
Hugging Face - Blog
Hugging Face - Blog
T
Tailwind CSS Blog
OSCHINA 社区最新新闻
OSCHINA 社区最新新闻
IT之家
IT之家
博客园_首页
博客园 - 三生石上(FineUI控件)
博客园 - 叶小钗
Apple Machine Learning Research
Apple Machine Learning Research
freeCodeCamp Programming Tutorials: Python, JavaScript, Git & More
量子位
钛媒体:引领未来商业与生活新知
钛媒体:引领未来商业与生活新知
人人都是产品经理
人人都是产品经理
美团技术团队
小众软件
小众软件
Jina AI
Jina AI
S
SegmentFault 最新的问题
博客园 - Franky
让小产品的独立变现更简单 - ezindie.com
让小产品的独立变现更简单 - ezindie.com

博客园 - mengfanrong

防止WordPress利用xmlrpc.php进行暴力破解以及DDoS 汇编语言学习笔记(5)——[bx]和loop 机房收费系统——项目开发计划书 jquery实现返回基部案例效果 【LeetCode】Power of Two 用C/C++实现对STORM的执行信息查看和控制 bash可改动的环境变量 博主-橄榄山软件创始人-其人其事 构造函数模式自己定义js对象 UVA1626 - Brackets sequence(区间DP--括号匹配+递归打印) CentOS安装NodeJS及Express开发框架 RabbitMQ学习笔记 【数据库摘要】10_Sql_Create_Index win10 + VS2010 + OpenCV2.4.10重编译OpenCV开发环境搭建 再看《阿甘正传》 Swift开发iOS项目实战视频教程(二)---图片与动画 360面试小结 System.ServiceModel.CommunicationException: 接收HTTP 响应时错误发生 jQuery上传文件
C# 中堆与栈的浅记
mengfanrong · 2016-04-23 · via 博客园 - mengfanrong

C# 中堆与栈的浅记

        什么是堆和栈?

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

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

        1、值类型数据

        2、引用类型数据

        3、指针

        4、指令

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

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

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

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

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

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

规则:

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

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

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

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

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

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

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

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