.NET中的堆(Heap)和栈(Stack)的本质
计算机的内存可以分为代码块内存,Stack内存和Heap内存。代码块内存是在加载程序时存放程序机器代码的地方。
栈(Stack)一般存放函数内的局部变量。
堆(Heap)一般存放全局变量和类对象实例等。
若只是声明一个对象,则先在栈内存中为其分配地址空间,若再实例化它,则在堆内存中为其分配空间。
1、Stack VS Heap
由于计算机的内存分配过程比较抽象,下面举一个简单的程序片段,来图解和谐步骤对Stack和Heap内存的影响:
下面的StackVsHeap类有一个Person类和Fun1方法,当调用Fun1方法时,
当执行第一句语句,即:
在.net中,除了string、object、class、delegate、interface外,其他的类型为数值类型。一般(不是全部)存放在Stack内存中。
此处 int i=3; 是函数内的非静态变量,而数值类型为非引用类型,即会在Stack内存中分配一块区域来存放该变量的名和值。
当执行第二句语句,即:
.net也会在Stack内存中分配一个区域来存放该变量的名和值。而且地址块在 i=3 上面(LIFO)。
解释:
① FIFO(全称:First in,First out):先进先出。
② LIFO(全称:Last in,First out):后进先出。
当执行第三句语句,即:
时,我们可以分为两步来看:
1) 在Stack上分配一个Person类型的p引用变量(指针)(指向Heap上的地址);
2) 在Heap上分配一个控件来存储Person类的实例数据;
具体的过程如下图所示:
2、值类型和引用类型
理解了上面的过程,现在理解值类型和引用类型的变量则更加容易:
先看下面的图:

由于 int j=i; 中是int类型,为值类型变量,则 j=3 为 i=3 的拷贝;因此,修改 i 不会修改 j,修改 j 也不会修改 i;
而 Person p2=p 中Person类,是引用类型,因此p2和p指向同一个Heap地址块;因此,修改p2的值就会影响p的值。

.NET中的堆(Heap)和栈(Stack)的本质的更多相关文章
- iOS中的堆(heap)和栈(stack)的理解
操作系统iOS 中应用程序使用的计算机内存不是统一分配空间,运行代码使用的空间在三个不同的内存区域,分成三个段:“text segment “,“stack segment ”,“heap segme ...
- [转]JVM 内存初学 (堆(heap)、栈(stack)和方法区(method) )
这两天看了一下深入浅出JVM这本书,推荐给高级的java程序员去看,对你了解JAVA的底层和运行机制有比较大的帮助.废话不想讲了.入主题: 先了解具体的概念:JAVA的JVM的内存可分为3个区:堆(h ...
- 堆heap和栈Stack(百科)
堆heap和栈Stack 在计算机领域,堆栈是一个不容忽视的概念,堆栈是两种数据结构.堆栈都是一种数据项按序排列的数据结构,只能在一端(称为栈顶(top))对数据项进行插入和删除.在单片机应用中,堆栈 ...
- JVM 内存初学 堆(heap)、栈(stack)和方法区(method)
这两天看了一下深入浅出JVM这本书,推荐给高级的java程序员去看,对你了解JAVA的底层和运行机制有比较大的帮助.废话不想讲了.入主题:先了解具体的概念:JAVA的JVM的内存可分为3个区:堆(he ...
- 转:JVM 内存初学 (堆(heap)、栈(stack)和方法区(method) )
原文地址:JVM 内存初学 (堆(heap).栈(stack)和方法区(method) ) 博主推荐 深入浅出JVM 这本书 先了解具体的概念:JAVA的JVM的内存可分为3个区:堆(heap).栈( ...
- java虚拟机知识和 内存 堆(heap)、栈(stack)和方法区(method)
1.虚拟机实例 每个java程序都运行在自己的java虚拟机实例中,运行三个java程序就会得到三个虚拟机实例 守护线程(虚拟机自己使用,比如说执行垃圾收集任务的线程) 非守护线程(java初试线程, ...
- JVM 内存初学 (堆(heap)、栈(stack)和方法区(method) )(转载)
想想面试的时候很多会问jvm这方面的问题虽然还是菜鸟不太能用到现在但是还是了解一下, 找资料的时候看见个大佬写的很好转载到这方便以后自己复习和给大佬做宣传 以下为大佬的博客原文: 这两天看了一下深入浅 ...
- iOS数据存储类型 及 堆(heap)和栈(stack)
iOS数据存储类型 及 堆(heap)和栈(stack) 一般认为在c中分为这几个存储区: 1栈 -- 由编译器自动分配释放. 2堆 -- 一般由程序员分配释放,若程序员不释放,程序结束时可能由O ...
- java面试之----堆(heap)、栈(stack)和方法区(method)
JAVA的JVM的内存可分为3个区:堆(heap).栈(stack)和方法区(method)也叫静态存储区. 堆区: 1.存储的全部是对象,每个对象都包含一个与之对应的class的信息.(class的 ...
随机推荐
- Nginx部署tomcat/wildfly集群负载均衡
1.调度器配置: docker run -p 80:80 --name nginx --restart=always -v /root/nginx/www/:/usr/share/nginx/htm ...
- 20155234 2016-2017-2 《Java程序设计》第3 周学习总结
20155234 2006-2007-2 <Java程序设计>第3周学习总结 教材学习内容总结 类是对象的设计图,对象是类的实例. 参考名称与对象数据成员同名时,可以在数据成员前使用thi ...
- ## 20155336 2016-2017-2《JAVA程序设计》第十周学习总结
20155336 2016-2017-2<JAVA程序设计>第十周学习总结 学习任务 完成学习资源中相关内容的学习 参考上面的学习总结模板,把学习过程通过博客(随笔)发表,博客标题“学号 ...
- springboot之oauth2
一.OAuth2.0是OAuth协议的延续版本,但不向后兼容OAuth 1.0即完全废止了OAuth1.0. OAuth 2.0关注客户端开发者的简易性.要么通过组织在资源拥有者和HTTP服务商之间的 ...
- 《手把手教你学DSP-基于TMS320F28335》书中的错误
1. 在书的345页,这种字符串写法是错误的,char *msg. 2. 估计张卿杰可能是个学着.书的风格感觉就是翻译的PDF文档.
- 无旋treap的区间操作实现
最近真的不爽...一道维修数列就做了我1上午+下午1h+1晚上+晚上1h+上午2h... 一道不错的自虐题... 由于这一片主要讲思想,代码我放这里了 不会无旋treap的童鞋可以进这里 呵呵... ...
- MAVEN相关文章
Maven入门指南① :Maven 快速入门及简单使用 Maven入门指南② :Maven 常用命令,手动创建第一个 Maven 项目 Maven入门指南③:坐标和依赖 Maven入门指南④:仓库 M ...
- 【mysql经典题目】科目成绩都大于80分\每个科目的第一名\总成绩排名
参考:http://blog.csdn.net/lifushan123/article/details/44948135 1.查询出科目成绩都大于80分的学生的名字? drop table if EX ...
- 深入解析QML引擎, 第2部分: 绑定(Bindings)
原文 QML Engine Internals, Part 2: Bindings 译者注:这个解析QML引擎的文章共4篇,分析非常透彻,在国内几乎没有找到类似的分析,为了便于国内的QT/QML爱好 ...
- 一个web应用的诞生(5)--数据表单
下面把角色分为两种,普通用户和管理员用户,至少对于普通用户来说,直接修改DB是不可取的,要有用户注册的功能,下面就开始进行用户注册的开发. 用户表 首先要想好用户注册的时候需要提供什么信息:用户名.密 ...