这个区别对于我们来说并不大,这是内存分配的两种方法。一般代码逻辑,简单变量,结构体都是放入栈中,而对象,以及被装箱的数据是放入堆中的。

简单来说,栈就是一个很长的栈(数据结构中的栈,如果不理解可以当做是像线一样的一长串数据)。里面存着各种逻辑,以及像整形,浮点型等数据,根据栈先进先出的原则,代码会一条条被执行,执行代码中包含着栈中可以存放的数据。但数据量过大的时候,存入栈中会明显影响性能。所以,我们将大量的数据存入堆中,之后,栈中放堆的地址。这样,在进行数据调用的时候,可以通过地址找到对应数据。


对于我们来说,没有什么特别的方法可以进行堆和栈之间的转换,比如说结构体就是值类型,只能放在栈中,除非你把它转换为类,否则它永远都在栈中。反之亦然。

而简单数据的话,在C#中可以进行一个强制类型转换来进行装箱。

比如说:

int a = 1;
object i = (object)a;


把一个整数值类型的变量装箱进一成为一个引用类型,这样做明显会增加程序的运行时间,减低性能。而且在拆箱的时候,必须注意它原来的数据类型。否则可能出现拆箱失败的情况。由此可见,对于内存的管理,我们还是直接交给CLR比较好。强行的装箱拆箱,只会增加程序运行时间,减低系统性能,降低代码可读性。


堆内存和栈内存的区别可以用如下的比喻来看出:使用堆内存就象是自己动手做喜欢吃的菜肴,比较麻烦,但是比较符合自己的口味,而且自由度大。使

用栈内存就象我们去饭馆里吃饭,只管点菜(发出申请)、付钱和吃(使用),吃饱了就走,不必理会切菜、洗菜等准备工作和洗碗、刷锅等扫尾工作,

他的好处是快捷,但是自由度小。操作系统中所说的堆内存和栈内存,在操作上有上述的特点,这里的堆内存实际上指的就是(满足堆内存性质的)优先

队列的一种数据结构,第1个元素有最高的优先权;栈内存实际上就是满足先进后出的性质的数学或数据结构。

在标准C语言上,使用malloc等内存分配函数获取内存即是从堆中分配内存,而在一个函数体中例如定义一个数组之类的操作是从栈中分配内存。从堆中

分配的内存需要程序员手动释放,如果不释放,而系统内存管理器又不自动回收这些堆内存的话(实现这一项功能的系统很少)那就一直被占用。如果一

直申请堆内存,而不释放,内存会越来越少,很明显的结果是系统变慢或者申请不到新的堆内存。而过度的申请堆内存(可以试试在函数中申请一个1G

的数组!),会导致堆被压爆,结果是灾难性的。