关于.NET 使用堆栈来维护值类型变量的思考和理解
2010-06-11 18:58
363 查看
昨天睡觉前翻了下那本“红转头”,一眼扫过值类型与引用类型。值类型的变量是在堆栈上维护,引用类型是在堆上维护。之所以不同对待,是有原因的。
值类型的变量,首先他们占用的空间相对较少,分配和销毁的开销要小得多,生命周期的开始和结束非常明确,所以放到堆栈上处理。(这里的之类型变量是指那些不是作为引用类型的字段成员的值类型变量)一旦程序运行处声明该值类型变量的作用域,该变量的生命周期即结束,就可以销毁。由于变量的声明在其作用域内是有先后顺序的,所以他们会被按执行顺序先后被压入栈中。当代码运行出该作用域后,该作用域内的所有值类型变量生命周期结束,即都可销毁,至于销毁的前后顺序已不再重要,也没有区别。总之对于那些刚刚失去作用的值类型变量会被从栈中弹出。从而保证了内存的有效利用,避免浪费。代码的顺序执行和堆栈的先进后出特征保证了最后运行的代码块包围的作用域里面的值类型变量总是位于堆栈的顶端,最先被压出。
引用类型因为一般占用内存空间相对较大,生命周期判断复杂。引用类型的变量的引用的实例存放在托管堆上,由于引用类型变量里实际存放的是实例在堆上的地址,所以对于应用类型的实例他的生命周期无法根据声明和实例化的位置来决定他的生死。托管堆同时还维护着一个实例的所有引用。首先检查这些引用变量的生命周期,如果所有引用该实例的变量都已经释放,那么此时该实例就可以释放。当然具体的释放时机有垃圾收集器统一间断的进行的。
值类型的变量,首先他们占用的空间相对较少,分配和销毁的开销要小得多,生命周期的开始和结束非常明确,所以放到堆栈上处理。(这里的之类型变量是指那些不是作为引用类型的字段成员的值类型变量)一旦程序运行处声明该值类型变量的作用域,该变量的生命周期即结束,就可以销毁。由于变量的声明在其作用域内是有先后顺序的,所以他们会被按执行顺序先后被压入栈中。当代码运行出该作用域后,该作用域内的所有值类型变量生命周期结束,即都可销毁,至于销毁的前后顺序已不再重要,也没有区别。总之对于那些刚刚失去作用的值类型变量会被从栈中弹出。从而保证了内存的有效利用,避免浪费。代码的顺序执行和堆栈的先进后出特征保证了最后运行的代码块包围的作用域里面的值类型变量总是位于堆栈的顶端,最先被压出。
引用类型因为一般占用内存空间相对较大,生命周期判断复杂。引用类型的变量的引用的实例存放在托管堆上,由于引用类型变量里实际存放的是实例在堆上的地址,所以对于应用类型的实例他的生命周期无法根据声明和实例化的位置来决定他的生死。托管堆同时还维护着一个实例的所有引用。首先检查这些引用变量的生命周期,如果所有引用该实例的变量都已经释放,那么此时该实例就可以释放。当然具体的释放时机有垃圾收集器统一间断的进行的。
相关文章推荐
- 用类名做方法的返回值类型 在学习Java的初始阶段,很多同学使用基本数据类型定义变量和引用类型定义变量以及使用类名做方法的返回值类型常常不知所以。今天我以自己的解读方式和个人的理解作一个简单的解释,和
- 关于堆栈与队列使用的小思考(1)
- 关于数组声明元素数量可否使用enum类型变量的测试
- 关于c语言不同类型变量存放位置的个人理解
- 关于C/C++中静态本地变量的使用与数据类型修饰符const
- The NOTE of learning ASP.NET [10] 关于.NET整型与浮点型变量使用上的效率和存储问题
- 一次关于使用status作为变量引发的bug及思考
- 关于如何使用反射声明一个泛型类型变量(泛型参数是动态的)的问题
- 关于条件变量和互斥锁为何配合使用的思考
- 关于使用video标签时src网址blob类型的理解
- 深入理解Java特性:关于继承的使用思考
- .net 3.0+关于实现IEnumerable的类型的扩展方法的使用一
- Linux0.11 由进程睡眠函数sleep_on()中的堆栈变量tmp引发的思考 关于进程内核堆栈
- 关于变量的类型与变量初始化的一点思考
- 关于使用video标签时src网址blob类型的理解
- 给.NET初学者推荐的一篇文章(图文并茂,理解深刻) - .NET中六个重要的概念:堆栈,堆,值类型,引用类型,装箱和拆箱
- 关于CFont类型成员变量m_font 在使用m_font.CreatePointFont时出现ASSERT(m_hObject == NULL)断言
- 关于js中数据类型的自我理解
- 关于卷积神经网络该如何理解的一些思考
- 使用eclipse JDT compile class,解决 没法确定 X 的类型参数;对于上限为 X,java.lang.Object 的类型变量 X,不存在唯一最大实例