栈(Stack)和堆(Heap)。  

栈是在程序运行过程中用于保存指令,值类型变量的内存区域(一个线程对应一个栈),栈的结构和数据结构中“栈”的结构是一样的,“先进后出”。

堆也就是托管堆(managed heap),进程初始化的时候,CLR要保留一块连续的地址空间,这个地址空间最初并没有对应的物理存储空间。这个地址空间就是托管堆。

* 栈vs堆:有什么不同?

栈负责保存我们的代码执行(或调用)路径,而堆则负责保存对象(或者说数据,接下来将谈到很多关于堆的问题)的路径。

可以将栈想象成一堆从顶向下堆叠的盒子。当每调用一次方法时,我们将应用程序中所要发生的事情记录在栈顶的一个盒子中,而我们每次只能够使用栈顶的那个盒子。当我们栈顶的盒子被使用完之后,或者说方法执行完毕之后,我们将抛开这个盒子然后继续使用栈顶上的新盒子。堆的工作原理比较相似,但大多数时候堆用作保存信息而非保存执行路径,因此堆能够在任意时间被访问。与栈相比堆没有任何访问限制,堆就像床上的旧衣服,我们并没有花时间去整理,那是因为可以随时找到一件我们需要的衣服,而栈就像储物柜里堆叠的鞋盒,我们只能从最顶层的盒子开始取,直到发现那只合适的。

栈是自行维护的,也就是说内存自动维护栈,当栈顶的盒子不再被使用,它将被抛出。相反的,堆需要考虑垃圾回收,垃圾回收用于保持堆的整洁性,没有人愿意看到周围都是赃衣服,那简直太臭了!

* 栈和堆里有些什么?

当我们的代码执行的时候,栈和堆中主要放置了四种类型的数据:值类型(Value Type),引用类型(Reference Type),指针(Pointer),指令(Instruction)。

1. 引用类型总是放在堆中。

2. 值类型和指针总是放在它们被声明的地方。

* 参数,大问题

这里有一个代码执行时的详细介绍,我们将深入第一部分出现的方法调用过程...

当我们调用一个方法时,会发生以下的事情:

1.方法执行时,首先在栈上为对象实例中的方法分配空间,然后将方法拷贝到栈上(此时的栈被称为帧),但是该空间中只存放了执行方法的指令,并没有方法内的数据项。
2.方法的调用地址(或者说指针)被放置到栈上,一般来说是一个GOTO指令,使我们能够在方法执行完成之后,知道回到哪个地方继续执行程序。(最好能理解这一点,但并不是必须的,因为这并不会影响我们的编码)
3.方法参数的分配和拷贝是需要空间的,这一点是我们需要进一步注意。
4.控制此时被传递到了帧上,然后线程开始执行我们的代码。因此有另一个方法叫做"调用栈"。

* 值类型传递

深拷贝

首先,当我们传递一个值类型参数时,栈上被分配好一个新的空间,然后该参数的值被拷贝到此空间中。

必须注意的是,如果我们要将一个非常大的值类型数据(如数据量大的struct类型)入栈,它会占用非常大的内存空间,而且会占有过多的处理器周期来进行拷贝复制。栈并没有无穷无尽的空间,它就像在水龙头下盛水的杯子,随时可能溢出。struct是一个能够存放大量数据的值类型成员,我们必须小心地使用。

* 引用类型传递

浅拷贝

转载于:https://www.cnblogs.com/jaryup/archive/2011/12/02/2272141.html

Asp.net系列--基础篇(二)相关推荐

  1. 回头再学Asp.net系列--基础篇(一)

    Web Page的生命周期与Postback 参考 http://www.cnblogs.com/artech/archive/2007/04/06/702658.html 了解ASP.NET Web ...

  2. Asp.net系列--基础篇(一)

    Web Page的生命周期与Postback 了解ASP.NET Web Page的生命周期对于一个做WEB开发的工程师来说很有必要,尤其是用于编写自己的control的时候. ASP.NET Web ...

  3. 回头再学Asp.net系列--基础篇(六)

    随着面向对象分析与设计的发展,一个良好的设计,核心原则之一就是将变化隔离,使得变化部分发生变化时,不变部分不受影响(这也是OCP的目的).为了做到这一点,要利用面向对象中的多态性,使用多态性后,客户类 ...

  4. SQL Server调优系列基础篇(子查询运算总结)

    前言 前面我们的几篇文章介绍了一系列关于运算符的介绍,以及各个运算符的优化方式和技巧.其中涵盖:查看执行计划的方式.几种数据集常用的连接方式.联合运算符方式.并行运算符等一系列的我们常见的运算符.有兴 ...

  5. SQL Server 调优系列基础篇 - 子查询运算总结

    前言 前面我们的几篇文章介绍了一系列关于运算符的介绍,以及各个运算符的优化方式和技巧.其中涵盖:查看执行计划的方式.几种数据集常用的连接方式.联合运算符方式.并行运算符等一系列的我们常见的运算符.有兴 ...

  6. SQL Server调优系列基础篇(常用运算符总结)

    原文:SQL Server调优系列基础篇(常用运算符总结) 前言 上一篇我们介绍了如何查看查询计划,本篇将介绍在我们查看的查询计划时的分析技巧,以及几种我们常用的运算符优化技巧,同样侧重基础知识的掌握 ...

  7. 一起学Pandas系列基础篇---loc和iloc

    一起学Pandas系列基础篇-loc和iloc 一起学Pandas系列基础篇---loc和iloc 一起学Pandas系列基础篇---loc和iloc 本篇学习内容介绍 一.loc 1. 选择索引为0 ...

  8. 一起学Pandas系列基础篇---at和iat

    一起学Pandas系列基础篇-数据选择之at和iat 一起学Pandas系列基础篇---at和iat 一起学Pandas系列基础篇---数据选择之at和iat 本篇学习内容介绍 一.at 1. 选择B ...

  9. 用Kotlin撸一个图片压缩插件-插件基础篇(二)

    简述: 前两天写了篇用Kotlin撸一个图片压缩插件-导学篇,现在迎来了插件基础篇,没错这篇文章就是教你如何一步一步从零开始写一个插件,包括插件项目构建,运行,调试到最后的上线发布整个流程.如果你是插 ...

最新文章

  1. 华为服务器故障灯不开机_总有故障灯亮却不知道是怎么回事?详解这些你不认识的故障灯...
  2. ApplicationEventPublisherAware--待完善
  3. 【错误记录】Android Studio 编译信息输出乱码
  4. java rest post list,Java RestTemplate.postForLocation方法代码示例
  5. python数列分段_按范围分段的Python数组
  6. python3函数写文件路径时,怎么写文件路径
  7. MySQL学习-SQL语句的分类与MySQL简单查询
  8. [Web Chart系列之二] 各种实现js 图表的library汇总与比较
  9. RDMA的原理、传输与Verbs
  10. 用给出的Cramer规则解线性方程组
  11. ~《概率论》~联合分布与边际分布
  12. 2 什么是计算机网络的拓扑结构,什么是网络拓扑?
  13. 用Android studio设计贺卡,功能强大的贺卡设计制作软件推荐:Hallmark Card Studio
  14. PHP 常用字符串、数组处理函数
  15. CTFd运维-CTFd平台搭好后,遇到网页访问慢,卡顿非常厉害的解决方法
  16. lr_Analysis结果分析工具
  17. 避免lammps弛豫出错的一个小技巧
  18. 小米/红米手机,刷入第三方recovery(红米5 plus为例)
  19. Matlab在线使用
  20. 浅谈CGI程序与web间数据交互

热门文章

  1. php spl自动加载类,php – SPL自动加载最佳实践
  2. html5在别的电脑上打不开,U盘在别台电脑上打不开的原因分析及解决
  3. conda里的r语言,使用“ conda”从github安装R软件包。
  4. 怎样在接口地址中添加请求头参数_jmeter5.3做soap接口性能测试配置
  5. isfile方法_递归算法是一种直接或者间接调用自身函数或者方法的算法
  6. pythontransform详解_Python自定义聚合函数merge与transform区别详解
  7. matlab 万年历,转 计算万年历的Matlab程序
  8. 把计算机怎么连接手机的网络助手在哪里,手机连接电脑上网,详细教您手机如何连接电脑上网...
  9. 原生html如何发送网络请求,原生JS向服务器发送GET请求
  10. cfb为什么不需要填充_高压输电线路中为什么只有相线不需要零线