Asp.net系列--基础篇(二)
栈(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系列--基础篇(二)相关推荐
- 回头再学Asp.net系列--基础篇(一)
Web Page的生命周期与Postback 参考 http://www.cnblogs.com/artech/archive/2007/04/06/702658.html 了解ASP.NET Web ...
- Asp.net系列--基础篇(一)
Web Page的生命周期与Postback 了解ASP.NET Web Page的生命周期对于一个做WEB开发的工程师来说很有必要,尤其是用于编写自己的control的时候. ASP.NET Web ...
- 回头再学Asp.net系列--基础篇(六)
随着面向对象分析与设计的发展,一个良好的设计,核心原则之一就是将变化隔离,使得变化部分发生变化时,不变部分不受影响(这也是OCP的目的).为了做到这一点,要利用面向对象中的多态性,使用多态性后,客户类 ...
- SQL Server调优系列基础篇(子查询运算总结)
前言 前面我们的几篇文章介绍了一系列关于运算符的介绍,以及各个运算符的优化方式和技巧.其中涵盖:查看执行计划的方式.几种数据集常用的连接方式.联合运算符方式.并行运算符等一系列的我们常见的运算符.有兴 ...
- SQL Server 调优系列基础篇 - 子查询运算总结
前言 前面我们的几篇文章介绍了一系列关于运算符的介绍,以及各个运算符的优化方式和技巧.其中涵盖:查看执行计划的方式.几种数据集常用的连接方式.联合运算符方式.并行运算符等一系列的我们常见的运算符.有兴 ...
- SQL Server调优系列基础篇(常用运算符总结)
原文:SQL Server调优系列基础篇(常用运算符总结) 前言 上一篇我们介绍了如何查看查询计划,本篇将介绍在我们查看的查询计划时的分析技巧,以及几种我们常用的运算符优化技巧,同样侧重基础知识的掌握 ...
- 一起学Pandas系列基础篇---loc和iloc
一起学Pandas系列基础篇-loc和iloc 一起学Pandas系列基础篇---loc和iloc 一起学Pandas系列基础篇---loc和iloc 本篇学习内容介绍 一.loc 1. 选择索引为0 ...
- 一起学Pandas系列基础篇---at和iat
一起学Pandas系列基础篇-数据选择之at和iat 一起学Pandas系列基础篇---at和iat 一起学Pandas系列基础篇---数据选择之at和iat 本篇学习内容介绍 一.at 1. 选择B ...
- 用Kotlin撸一个图片压缩插件-插件基础篇(二)
简述: 前两天写了篇用Kotlin撸一个图片压缩插件-导学篇,现在迎来了插件基础篇,没错这篇文章就是教你如何一步一步从零开始写一个插件,包括插件项目构建,运行,调试到最后的上线发布整个流程.如果你是插 ...
最新文章
- 华为服务器故障灯不开机_总有故障灯亮却不知道是怎么回事?详解这些你不认识的故障灯...
- ApplicationEventPublisherAware--待完善
- 【错误记录】Android Studio 编译信息输出乱码
- java rest post list,Java RestTemplate.postForLocation方法代码示例
- python数列分段_按范围分段的Python数组
- python3函数写文件路径时,怎么写文件路径
- MySQL学习-SQL语句的分类与MySQL简单查询
- [Web Chart系列之二] 各种实现js 图表的library汇总与比较
- RDMA的原理、传输与Verbs
- 用给出的Cramer规则解线性方程组
- ~《概率论》~联合分布与边际分布
- 2 什么是计算机网络的拓扑结构,什么是网络拓扑?
- 用Android studio设计贺卡,功能强大的贺卡设计制作软件推荐:Hallmark Card Studio
- PHP 常用字符串、数组处理函数
- CTFd运维-CTFd平台搭好后,遇到网页访问慢,卡顿非常厉害的解决方法
- lr_Analysis结果分析工具
- 避免lammps弛豫出错的一个小技巧
- 小米/红米手机,刷入第三方recovery(红米5 plus为例)
- Matlab在线使用
- 浅谈CGI程序与web间数据交互
热门文章
- php spl自动加载类,php – SPL自动加载最佳实践
- html5在别的电脑上打不开,U盘在别台电脑上打不开的原因分析及解决
- conda里的r语言,使用“ conda”从github安装R软件包。
- 怎样在接口地址中添加请求头参数_jmeter5.3做soap接口性能测试配置
- isfile方法_递归算法是一种直接或者间接调用自身函数或者方法的算法
- pythontransform详解_Python自定义聚合函数merge与transform区别详解
- matlab 万年历,转 计算万年历的Matlab程序
- 把计算机怎么连接手机的网络助手在哪里,手机连接电脑上网,详细教您手机如何连接电脑上网...
- 原生html如何发送网络请求,原生JS向服务器发送GET请求
- cfb为什么不需要填充_高压输电线路中为什么只有相线不需要零线