一、值类型与引用类型的存储方式:
引用类型:引用类型存储在堆中。类型实例化的时候,会在堆中开辟一部分空间存储类的实例。类对象的引用还是存储在栈中。
值类型:值类型总是分配在它声明的地方,做为局部变量时,存储在栈上;类对象的字段时,则跟随此类存储在堆中。
我们再看看引用类型和值类型的内存分配情况(我们对着代码与图看)
示列代码:
内存分布情况:
从上面两张图我们可以看出:
1)栈的结构是后进先出,也就是说:变量j的生命周期在变量s之前结束,变量s的生命周期在变量i之前结束,
2)栈地址从高往底分配
3)类型的引用也存储在栈中
二、对于堆和栈的详细介绍。
声明:以下内容从网络整理,非原创,适当待入个人理解.
解释1、
栈是编译期间就分配好的内存空间,因此你的代码中必须就栈的大小有明确的定义;
堆是程序运行期间动态分配的内存空间,你可以根据程序的运行情况确定要分配的堆内存的大小
解释2、
存放在栈中时要管存储顺序,保持着先进后出的原则,他是一片连续的内存域,有系统自动分配和维护。
而堆是无序的,他是一片不连续的内存域,有用户自己来控制和释放,如果用户自己不释放的话,当内存达到一定的特定值时,通过垃圾回收器(GC)来回收。
解释3、
栈,栈通常保存着我们代码执行的步骤,如在代码中的函数的参数、局部变量、返回数据等,或多或少负责跟踪正在程序中运行的代码。
堆,堆上存放的则多是对象、数据等,或多或少负责跟踪程序对象或数据。
栈,把它想像成叠在一起的盒子(像搭积木一样)。每一次调用一个方法就会在最上面叠一个盒子,用来跟踪程序运行情况。我们只能使用栈中叠在最上面的盒子里的东西。当某一最上面的盒子里的代码执行完毕(如方法执行完成),就把它扔掉并继续去使用下一个盒子。
堆,与栈类似,只是它是用来保存信息而不是跟踪执行。所以,堆里的任何信息都可以在任何时间被访问。有了堆,访问信息没有约束,而不像栈只能访问最上面的盒子。
堆的情况就像你把一堆刚洗完的衣服放在床上还没有时间来的及收走,你可以迅速拿到你想要拿的衣服。
栈的情况就像你叠在一起的鞋盒子,你需要拿走最上面的盒子才能拿到下一个盒子。
栈与堆示意图:
1)有人老是搞不明白堆和栈的叫法。我来解释下:
堆:在c里面叫堆,在c#里面其实叫托管堆。为什么叫托管堆,我们往下看。
栈:就是堆栈,因为和堆一起叫着别扭,就简称栈了。
2)托管堆:
托管堆不同于堆,它是由CLR(公共语言运行库(Common Language Runtime))管理,当堆中满了之后,会自动清理堆中的垃圾。所以,做为.net开发,我们不需要关心内存释放的问题。
3)有人老是搞不清楚内存堆栈与数据结构堆栈,我们来看看什么是内存堆栈,什么是数据结构堆栈
数据结构堆栈:是一种后进先出的数据结构,它是一个概念,从上图可以看出,栈是一种后进先出的数据结构。
内存堆栈:存在内存中的两个存储区(堆区,栈区)。
栈区:存放函数的参数、局部变量、返回数据等值,由编译器自动释放
堆区:存放着引用类型的对象,由CLR释放