理解堆与栈

导航

深入浅出图解C#堆与栈 C# Heap(ing) VS Stack(ing) 第一节 理解堆与栈

深入浅出图解C#堆与栈 C# Heap(ing) VS Stack(ing) 第二节 栈基本工作原理

深入浅出图解C#堆与栈 C# Heap(ing) VS Stack(ing) 第三节 栈与堆,值类型与引用类型

深入浅出图解C#堆与栈 C# Heap(ing) VS Stack(ing) 第四节 参数传递对堆栈的影响 1

深入浅出图解C#堆与栈 C# Heap(ing) VS Stack(ing) 第四节 参数传递对堆栈的影响 2

深入浅出图解C#堆与栈 C# Heap(ing) VS Stack(ing) 第五节 引用类型复制问题及用克隆接口ICloneable修复

深入浅出图解C#堆与栈 C# Heap(ing) VS Stack(ing) 第六节 理解垃圾回收GC,提搞程序性能

前言

虽然在.Net Framework 中我们不必考虑内在管理和垃圾回收(GC),但是为了优化应用程序性能我们始终需要了解内存管理和垃圾回收(GC)。另外,了解内存管理可以帮助我们理解在每一个程序中定义的每一个变量是怎样工作的。

简介

这篇文章会包含堆与栈的基础知识,变量类型,变量工作原理。

在程序运行时,.NET FRAMEWORK把对象存储在内存中的两个位置:堆与栈,并且它们都会帮助我们更好的运行程序。堆与栈寄存在电脑的操作内存中,并包含我们需要的信息使整个程序运行正常。

堆与栈:有什么不同?

,或多或少负责跟踪正在程序中运行的代码。

,或多或少负责跟踪程序对象或数据。

栈,把它想像成叠在一起的盒子(像搭积木一样)。每一次调用一个方法就会在最上面叠一个盒子,用来跟踪程序运行情况。我们只能使用栈中叠在最上面的盒子里的东西。当某一最上面的盒子里的代码执行完毕(如方法执行完成),就把它扔掉并继续去使用下一个盒子。

堆,与栈类似,只是它是用来保存信息而不是跟踪执行。所以,堆里的任何信息都可以在任何时间被访问。有了堆,访问信息没有约束,而不像栈只能访问最上面的盒子。

堆的情况就像你把一堆刚洗完的衣服放在床上还没有时间来的及收走,你可以迅速拿到你想要拿的衣服。栈的情况就像你叠在一起的鞋盒子,你需要拿走最上面的盒子才能拿到下一个盒子。

上图并不上真正的内存运行情况,只是为了让大家区分堆和栈。

栈,会自我管理,它有自己的内存管理机制。当最上面的盒子不再使用时,会自动被扔掉。

堆,相反,我们要控制它的垃圾回收(GC)。我们要去管理堆是否干净,就像管理床上的脏衣服。你不手动扔掉它,就会在床上变臭。

什么在堆和栈里

当程序执行时,我们主要有4种类型的东西放进堆和栈里:值类型,引用类型,指针,指令。

值类型:

  • bool
  • byte
  • char
  • decimal
  • double
  • enum
  • float
  • int
  • long
  • sbyte
  • short
  • struct
  • uint
  • ulong
  • ushort

它们都衍生于System.ValueType。

引用类型:

  • class
  • interface
  • delegate
  • object
  • string

它们都衍生于System.Object。当然object就是System.Object。

指针:

第三种被放于内存管理体制中的是类型的引用。这个引用通常被叫作指针。我们并不具体的使用指针,它们由CLR管理。一个指针(引用)是不同于引用类型的。我们定义它是一个引用类型,意味着我们可以通过指针访问它。一个指针占有一小块内存,这块内存指向另一块内存。指针占用在内存中的存储和其它的相同,只是存放的值既不是内存地址也不是空null。

指令:

我们会在后面的文章中介绍指令怎么工作。

总结

第一节到此结束,以后的章节里会介绍不同对象在堆和栈里存放的不同。

翻译于: http://www.c-sharpcorner.com/UploadFile/rmcochran/csharp_memory01122006130034PM/csharp_memory.aspx

【转】深入浅出图解C#堆与栈 C# Heap(ing) VS Stack(ing) 第一节 理解堆与栈相关推荐

  1. 【转】深入浅出图解C#堆与栈 C# Heap(ing) VS Stack(ing) 第二节 栈基本工作原理

    栈基本工作原理 导航 深入浅出图解C#堆与栈 C# Heap(ing) VS Stack(ing) 第一节 理解堆与栈 深入浅出图解C#堆与栈 C# Heap(ing) VS Stack(ing) 第 ...

  2. 【转】深入浅出图解C#堆与栈 C# Heap(ing) VS Stack(ing) 第四节 参数传递对堆栈的影响 2

    前言 虽然在.Net Framework 中我们不必考虑内在管理和垃圾回收(GC),但是为了优化应用程序性能我们始终需要了解内存管理和垃圾回收(GC).另外,了解内存管理可以帮助我们理解在每一个程序中 ...

  3. 【转】深入浅出图解C#堆与栈 C# Heap(ing) VS Stack(ing) 第三节 栈与堆,值类型与引用类型

    前言 虽然在.Net Framework 中我们不必考虑内在管理和垃圾回收(GC),但是为了优化应用程序性能我们始终需要了解内存管理和垃圾回收(GC).另外,了解内存管理可以帮助我们理解在每一个程序中 ...

  4. 【转】深入浅出图解C#堆与栈 C# Heap(ing) VS Stack(ing) 第六节 理解垃圾回收GC,提搞程序性能****

    前言 虽然在.Net Framework 中我们不必考虑内在管理和垃圾回收(GC),但是为了优化应用程序性能我们始终需要了解内存管理和垃圾回收(GC).另外,了解内存管理可以帮助我们理解在每一个程序中 ...

  5. 【转】深入浅出图解C#堆与栈 C# Heap(ing) VS Stack(ing) 第五节 引用类型复制问题及用克隆接口ICloneable修复

    前言 虽然在.Net Framework 中我们不必考虑内在管理和垃圾回收(GC),但是为了优化应用程序性能我们始终需要了解内存管理和垃圾回收(GC).另外,了解内存管理可以帮助我们理解在每一个程序中 ...

  6. 【转】深入浅出图解C#堆与栈 C# Heap(ing) VS Stack(ing) 第四节 参数传递对堆栈的影响 1

    前言 虽然在.Net Framework 中我们不必考虑内在管理和垃圾回收(GC),但是为了优化应用程序性能我们始终需要了解内存管理和垃圾回收(GC).另外,了解内存管理可以帮助我们理解在每一个程序中 ...

  7. stm32 堆和栈(stm32 Heap Stack)

    关于堆和栈已经是程序员的一个月经话题,大部分有是基于os层来聊的. 那么,在赤裸裸的单片机下的堆和栈是什么样的分布呢?以下是网摘: 刚接手STM32时,你只编写一个 int main() { whil ...

  8. [Java]Stack栈和Heap堆的区别(终结篇)[转]

    首先分清楚Stack,Heap的中文翻译:Stack-栈,Heap-堆. 在中文里,Stack可以翻译为"堆栈",所以我直接查找了计算机术语里面堆和栈开头的词语: 堆存储: hea ...

  9. stm32 堆和栈(stm32 Heap Stack)【worldsing笔记】

    关于堆和栈已经是程序员的一个月经话题,大部分有是基于os层来聊的. 那么,在赤裸裸的单片机下的堆和栈是什么样的分布呢?以下是网摘: 刚接手STM32时,你只编写一个 int main() { whil ...

最新文章

  1. python2升级_把Python2.6升级到Python2.7(适用于把Python2升级到Python3)
  2. kvm热添加和热迁移
  3. ×××服务器是指什么?我怎样控制自己的电脑端口的开启和关闭?
  4. 大学计算机一级考试内容和范围,大学计算机一级考试.doc
  5. a as as big rat_超好玩!12句英语绕口令,你能一口气读完几句?
  6. 嵌入式开发之路,从51单片机开始
  7. 专访iQOO Pro产品经理:以更好的产品 更低的价格推进5G生态普及
  8. 高通:2 亿像素手机 2020 年诞生!
  9. LightSpeed ORM .NET简单运用
  10. 这样一群人 致踏上CCIE之路的兄弟们!
  11. 小程序键盘遮挡输入框情况之一
  12. python之小说下载器version2.0
  13. 64位Win7 安装配置 64位Oracle11g + 32位InstantClient + PLSQL10
  14. ar虚拟现实电子沙盘软件制作
  15. java内存垃圾_Java内存区域与垃圾回收
  16. Intel超线程的沉沦与逆袭
  17. buuctf 九连环 解析
  18. java clob类型怎么插入数据库_在Java + Oracle环境下 对于clob类型的数据的插入
  19. FFTW库三个lib库的应用与区别
  20. 企业级内部信息统一搜索解决方案

热门文章

  1. 【C语言进阶深度学习记录】三十一 数组作为函数参数时退化为指针
  2. [HAOI2016]食物链
  3. ArcEngine中使用上下左右键移动地图
  4. iOS项目开发— CoreLocation的定位服务和地理编码与发编码实现
  5. PHP编写命令行脚本和后台运行程序的注意事项
  6. Python Interview Question and Answers
  7. 有些垃圾网站转载都不会
  8. [Kali][VMware][2020][窗口大小][分辨率]高分辨率自适应
  9. 某项目的双代号网络图如下所示_2019一级建造师项目管理知识点大全3
  10. java 私有变量访问_Java - 访问私有实例变量