1:分配方式和回收方式
栈得分配方式有两种,分别是静态分配和动态分配,无论是哪一种方式,栈空间的回收都是由操作系统处理的。即程序员不需要对栈空间进行处理,操作系统会帮助我们回收栈空间。
堆得分配方式只有动态分配。堆中分配的空间,需要程序员自己去释放。如果没有释放,会造成内存泄露。
2:大小以及结构
栈在计算机中是一段连续的空间,既然是连续空间,其空间大小必然不会太大。通常情况下,栈的空间是2M。倘若程序所占用的栈空间超过2M,就会发生栈溢出的错误。比如,太深层次的递归就容易造成栈溢出。
堆在计算机中的存储方式类似于链表,不是一段连续的空间。实际上,堆是将多个空闲的空间用链表连接在一起。因此,堆得大小是不确定的,而且,堆得空间要比栈大很多。当需要使用堆中的空间时,堆会从链表头开始查找,直至查找到某一个空闲块的空间是大于等于所需要的空间,然后将该空闲块分配。倘若有剩下的空间,剩下的空间会作为一个单独的空间块,并且由链表连接起来。
3:碎片问题
根据第二个不同点,很容易知道在使用堆时是有空间碎片的。而栈不存在这个问题,因为栈是直接分配的,倘若需要的空间大于剩余的栈空间,直接报栈溢出的错误;否则直接分配相应的空间。
4:哪些在栈中,哪些在堆中
基本变量,如 int 、char、string、float 等变量分配内存时,使用的都是栈中的空间。
对象,比如OC中的 [[class alloc] init]、 C++ 中new 、C语言中的 malloc 出的对象时,使用的都是堆中的空间。