栈基本工作原理

导航

深入浅出图解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)。另外,了解内存管理可以帮助我们理解在每一个程序中定义的每一个变量是怎样工作的。

简介

这一节介绍栈的基本工作原理。

两个黄金规则

  1. 引用类型永远存储在堆里。
  2. 值类型和指针永远存储在它们声明时所在的堆或栈里。

栈工作原理

栈,如第一节所说,在代码运行时负责跟踪每一个线程的所在(什么被调用了)。你可以把它想像成一个线程“状态”,而每一个线程都有它自己的栈。当我们的代码执行一次方法调用,线程开始执行寄存在方法(Method)表里的JIT编译过的指令,并且把该方法的参数存放到当前线程栈里。然后,随着代码的执行每遇见方法中的变量,该变量都会被放到栈的最上面,如此重复把所有变量都放到栈上(当然引用类型只存放指针)。

为了方便理解,让我们看代码与图例。

执行下面的方法:

  1. public int AddFive(int pValue)

  2. {

  3. int result;

  4. result = pValue + 5;

  5. return result;

  6. }

下面是栈里发生的情况.  有必要提醒的是,我们现在假设当前代码产生的栈存储会放到所有既有项(栈里已经存储的数据)之上。一旦我们开始执行该方法,方法参数pValue会被放到栈上(以后的文章里会介绍参数传递)。

注意:方法并不存在栈里,图只是为了阐述原理而放的引用。

下一步,控制(线程执行方法)被传递到寄存在方法类型表里的AddFive()方法对应的指令集中。如果方法是第一次被触发,会执行JIT编译。

随着方法的执行,栈会分配一块内存给变量result存放。

方法执行完成,返回result。

该次任务在栈里所占的所有内存将被清理,仅一个指针被移动到AddFive()开始时所在的可用内存地址上。接着会执行栈里AddFive()下面一个方法(图里看不到)。

在这个例子当中,变量result被放到了栈里。事实上,方法体内每次定义的值类型变量都会被放到栈里。

当然值类型有时候也会被放到堆里,我们将会在下一节提到。

总结

栈可以想像成一个严格顺序执行的序列,不允许跳跃穿插访问。栈有自我清理功能。本文以执行一个简单C#方法为例阐述了栈的基本工作原理。下一节继续介绍堆栈工作原理以及一个更复杂一些的例子。

翻译: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) 第四节 参数传递对堆栈的影响 1

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

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

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

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

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

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

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

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

    前言 虽然在.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. Del.icio.us应用工具杂烩
  2. Python入门100题 | 第049题
  3. Spring中的简单实现AOP小例子
  4. 计算机图形学基础考试题,计算机图形学基础复习题
  5. Qt Creator使用CVS
  6. 花开的声音 - 张靓颖
  7. ssd windows未能启动服务器,ssd安装win10无法启动你安装方法对吗?来看一下
  8. 获取到某一方法的调用者的类名、方法名、命名空间
  9. 分析“HTTP500内部服务器错误”解决方法
  10. matlab保存数据save,[转载]matlab中save,load使用方法
  11. 视频编解码(十八):编解码linux测试步骤
  12. 【跃迁之路】【523天】程序员高效学习方法论探索系列(实验阶段280-2018.07.13)...
  13. 牛客网SQL练习题(Mysql-8)
  14. Excel数据分析(八)图表
  15. http和https的区别
  16. 计算机科学技术标准,计算机科学技术基础知识之标准化和知识产权基础知识
  17. c语言二维数组输入数据,c语言编写程序,把下面的数据输入到一个二维数组中:...
  18. 信号灯管理服务器CPU型号,正文-新华三集团-H3C
  19. 查看苹果/Mac电脑的硬件配置的方法
  20. 集群搭建系列(八)Kafka

热门文章

  1. 从zip中读取文件 合并到指定的文件中
  2. not enough arguments for format string
  3. 1. 栈和队列的数组实现
  4. Maven pom.xml 元素配置说明(一)
  5. Nancy跨平台开发总结(三)发布到Jexus Web服务器
  6. GitHub---最简单的使用
  7. NCBI SRA数据预处理
  8. 贝叶斯软件genle教程_一文读懂蒙特卡罗方法和应用贝叶斯推理
  9. 最长非降子序列(动态规划dp dynamic programming)
  10. php聊天功能逻辑原理,@xxx提及用户,这种功能的实现原理是怎样的?