C# 中的堆和栈
来源:互联网 发布:小说阅读软件哪个好 编辑:程序博客网 时间:2024/05/16 01:51
栈上存储的有:值类型,引用类型本身。
栈内存就像一系列堆得越来越高的箱子。调用方法是,它的每一个参数都被放入一个箱子,并将这个箱子放到栈的最顶部。每个局部变量也同样分配到一个箱子,并同样放到栈的最顶部。方法结束后,它的所有箱子都从栈中移除。
堆上存储的有:引用类型的“对象”,可空类型。
堆内存则像散布在房间里的一大堆箱子,而不像栈那样每个箱子都严格地堆在另一个箱子上面。每一个箱子都有一个标签,它标记了这个箱子是否正在使用。创建一个新对象时,runtime 会查找一个空箱子,并把它分配给对象。对对象的引用则存储在栈上的一个局部变量中。runtime 将跟踪每个箱子的引用数量(有多个变量引用同一个对象)。一旦最后一个引用消失,runtime 就将箱子标记为“未使用”。将来某个时候,会清除箱子里的东西,使之能被真正重用。
另外,堆内存是一种有限资源,如果被耗尽,new 操作符将抛出一个 OutOfMemoryException ,对象将创建失败。
代码如下:
using System;using System.Collections.Generic;using System.Linq;using System.Text;namespace stack_heap{ class Program { static void Main(string[] args) { } void Method(int param) { Circle c; c = new Circle(param); } } class Circle { public Circle(int a) { } }}调用Method 方法时,并给 param 传递实参为 8 后:
1、首先,栈中将分配一小片内存(刚好能存储一个 int),并用值 8 来初始化。
2、在方法内部,还要从栈中分配出另一小片内存,它刚好能够存储一个引用(一个内存地址),只是暂时不进行初始化(它是为Cricle 类型的变量 c 准备的)。
3、接着从堆中分配一个足够大的内存区域来容纳一个 Circle 对象。
PS:new 关键字执行的操作 --- 它运行 Circle 构造器,将这个原始的堆内存转换成一个 Circle 对象。
- C# 中的堆和栈
- c#中的堆和栈
- C# 栈和堆
- C# 堆和栈
- C#中的堆与栈
- C#解惑:堆和栈
- net/c#中栈和堆的区别及代码在栈和堆中的执行流程详解之一
- net/c#中栈和堆的区别及代码在栈和堆中的执行流程详解之一
- .net/c#中栈和堆的区别及代码在栈和堆中的执行流程详解
- .net/c#中栈和堆的区别及代码在栈和堆中的执行流程详解之一
- java中的栈和堆
- Java中的堆和栈
- Java中的堆和栈
- java中的栈和堆
- c++中的堆和栈
- java中的堆和栈
- Java 中的堆和栈
- Java 中的堆和栈
- VC编译开关选项分析(debug和release版本的对比)
- C++字符串长度
- 欧拉道路(回路)的判断
- Matlab的二值化问题
- 快速排序
- C# 中的堆和栈
- 查看环境变量以及修改环境变量
- 日志服务器搭建
- Eclipse 不编译工程!转载!
- strace命令
- AXIS2中OMElement和Java对象之间的转换
- poj 1389 Area of Simple Polygons
- 二叉树排序
- 8月8日 完成listing 4-1的编译