您的位置:首页 > 运维架构

关于.NET 使用堆栈来维护值类型变量的思考和理解

2010-06-11 18:58 363 查看
昨天睡觉前翻了下那本“红转头”,一眼扫过值类型与引用类型。值类型的变量是在堆栈上维护,引用类型是在堆上维护。之所以不同对待,是有原因的。

值类型的变量,首先他们占用的空间相对较少,分配和销毁的开销要小得多,生命周期的开始和结束非常明确,所以放到堆栈上处理。(这里的之类型变量是指那些不是作为引用类型的字段成员的值类型变量)一旦程序运行处声明该值类型变量的作用域,该变量的生命周期即结束,就可以销毁。由于变量的声明在其作用域内是有先后顺序的,所以他们会被按执行顺序先后被压入栈中。当代码运行出该作用域后,该作用域内的所有值类型变量生命周期结束,即都可销毁,至于销毁的前后顺序已不再重要,也没有区别。总之对于那些刚刚失去作用的值类型变量会被从栈中弹出。从而保证了内存的有效利用,避免浪费。代码的顺序执行和堆栈的先进后出特征保证了最后运行的代码块包围的作用域里面的值类型变量总是位于堆栈的顶端,最先被压出。

引用类型因为一般占用内存空间相对较大,生命周期判断复杂。引用类型的变量的引用的实例存放在托管堆上,由于引用类型变量里实际存放的是实例在堆上的地址,所以对于应用类型的实例他的生命周期无法根据声明和实例化的位置来决定他的生死。托管堆同时还维护着一个实例的所有引用。首先检查这些引用变量的生命周期,如果所有引用该实例的变量都已经释放,那么此时该实例就可以释放。当然具体的释放时机有垃圾收集器统一间断的进行的。
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: 
相关文章推荐