概述
堆栈是两种数据结构。堆栈都是一种数据项按序排列的数据结构,只能在一端(称为栈顶(top))对数据项进行插入和删除。
要点:堆:队列优先,先进先出(FIFO)。栈:先进后出(FILO)。
堆栈空间分配
栈(操作系统):有操作系统自动分配释放,存放函数的参数值,局部变量的值等。其操作方式类似于数据结构中的栈。
堆(程序员&操作系统):一般由程序员分配释放,如程序员不释放,程序结束时可能由OS回收,分配方式类似于链表。
堆栈的缓存方式
栈使用的是一级缓存,他们通常都是被调用时处于存储空间中,调用完毕立即释放。
堆则是存放在二级缓存中,生命周期由虚拟机的垃圾回收算法来决定。
堆栈数据结构的区别
碎片问题:对于堆来讲,频繁的new/delete会造成内存空间的不连续,从而造成大量的碎片,使程序效率低下。对于栈来讲,不会存在这个问题,因为栈是先进后出的队列,以至于永远不可能有一个内存块从栈中间弹出,在它弹出之前,在它上面的后劲的栈内容已经被弹出。
生长方向:对于堆来讲,生长方向是向上的,也就是想着内存地址增加的方向;对于栈来讲,他的生长方向是向下的,是向着内存地址减小的方向增长。
分配方式:堆都是动态分配的,没有静态分配的堆。栈有两种分配方式:静态分配和动态分配。静态分配是由编译器完成的,比如局部变量的分配。动态分配由alloca函数进行分配,但是栈的动态分配和堆是不同的,它的动态分配由编译器进行释放,无须我们手工实现。
分配效率:栈是机器系统提供的数据结构,计算机会在底层对栈提供支持:分配专门的寄存器存放栈的地址,压栈出栈都有专门的指令执行,决定了栈的效率比较高。堆则是c/c++函数库提供的,效率比栈低得多。
虽然栈有很多好处,但是由于和堆相比不是那么灵活,有时候分配大量的内存空间,还是用堆好一些。
无论是堆还是栈,都要防止越界现象发生,因为越界的结果要么是程序崩溃,要么是摧毁程序的堆、栈结构,产生意想不到的结果,那个时候要debug是非常困难的。