堆栈起初接触刚接触时还是在单片机的时候,一个常见且密切相关的抽象数据结构类型,相互间插入(Push)、移除(Pop)按序排列.
栈区(stack)是由操作系统建立于某进程或线程上为该线程(进程)自动创建分配的一块内存存储空间,分配速度较快捷但无法手动控制,其具有 FIFO 特性 并遵循着先进后出的原则,通常函数调用时用于存储主函数中后的下一条指令的地址、各个声明函数的参数值和局部变量等相关数据,参数并由右往左入栈,此处静态变量是不入栈的.函数调用结束后局部变量先出栈其次是参数最后才是栈顶指针指向最开始的地址(即:主函数的下一条可执行指令).
堆区(heap)是向高地址扩展的数据结构,由于系统是用链表的方式存储空闲内存地址所以内存区域不是连续的,故通过链表遍历的方式由低地址向高地址;其堆的空间大小也会受限于计算机系统中有效的虚拟内存,因此所获得的空间也会较大且操作使用较为灵活,但是通过创建的方式分配内存所以分配速度要劣与栈相对较慢;其空间的开辟需要在程序运行时系统收到程序申请开辟空间时,首先会遍历空闲内存地址的链表并寻找空间大于所申请空间的堆结点,其次将该该结点从空闲结点链表中移除后在当前内存空间首地址处记录本次分配空间大小后将该结点空间配给程序使用,最后将程序使用该堆结点后多余部分的空间重新放入空闲链表中,虽然容易产生内存碎片但是使用较为方便.
两者间栈响应速率更加快捷但可操作的维度较小而堆响应速率较低但可操作的纬度较高.
栈属于一种线性结构,堆属于一种链式结构,每个堆栈通过基本地址和栈顶地址描述.其中全局变量、静态变量分配于静态数据区而本地变量分配于动态数据区,程序通过堆栈的基本地址与偏移量访问本地变量.
以上便是此次小结内容,希望对大家能有所帮助,有什么不足还望多多指教!