堆栈是一个不容忽视的概念,堆栈是两种数据结构。堆栈都是一种数据项按序排列的数据结构,只能在一端(称为栈顶(top))对数据项进行插入和删除。目标堆栈是指目标程序的形参、局部变量、返回值和真实数据的存储区。一般目标程序向系统申请,由系统自动分配和回收。
简介内存空间在逻辑上分为三部分:代码区、静态数据区和动态数据区,动态数据区又分为栈区和堆区。代码区:存储方法体的二进制代码。高级调度(作业调度)、中级调度(内存调度)、低级调度(进程调度)控制代码区执行代码的切换。静态数据区:存储全局变量、静态变量、常量,常量包括final修饰的常量和String常量。系统自动分配和回收。栈区:存储运行方法的形参、局部变量、返回值。由系统自动分配和回收。堆区:new一个对象的引用或地址存储在栈区,指向该对象存储在堆区中的真实数据。由程序员分配和回收(例如Java中由JVM虚拟机的垃圾回收机制自动回收)。目标堆栈简单来说用于管理目标程序运行时的形参、局部变量、返回值以及数据的存储区,由系统或程序员进行分配和回收。目标程序,又称为“目的程序”,为源程序经编译可直接被计算机运行的机器码集合,在计算机文件上以.obj作扩展名----由语言处理程序(汇编程序,编译程序,解释程序)将源程序处理(汇编,编译,解释)成与之等价的由机器码构成的,计算机能够直接运行的程序,该程序叫目标程序。目标代码尽管已经是机器指令,但是还不能运行,因为目标程序还没有解决函数调用问题,需要将各个目标程序与库函数连接,才能形成完整的可执行程序。
目标堆栈定义及区别栈区(stack)— 由编译器自动分配释放 ,存放函数的参数值,局部变量的值等。其操作方式类似于数据结构中的栈。 堆区(heap) — 一般由程序员分配释放, 若程序员不释放,程序结束时可能由OS回收 。它常用于管理算法执行过程中的信息,应用场景包括堆排序,优先队列等。注意它与数据结构中的堆是两回事,分配方式倒是类似于链表。栈:只要栈的剩余空间大于所申请空间,系统将为程序提供内存,否则将报异常提示栈溢出。 堆:首先应该知道操作系统有一个记录空闲内存地址的链表,当系统收到程序的申请时,会遍历该链表,寻找第一个空间大于所申请空间的堆结点,然后将该结点从空闲结点链表中删除,并将该结点的空间分配给程序,另外,对于大多数系统,会在这块内存空间中的首地址处记录本次分配的大小,这样,代码中的delete语句才能正确的释放本内存空间。另外,由于找到的堆结点的大小不一定正好等于申请的大小,系统会自动的将多余的那部分重新放入空闲链表中。栈:在Windows下,栈是向低地址扩展的数据结构,是一块连续的内存的区域。这句话的意思是栈顶的地址和栈的最大容量是系统预先规定好的,在 WINDOWS下,栈的大小是2M(也有的说是1M,总之是一个编译时就确定的常数),如果申请的空间超过栈的剩余空间时,将提示overflow。因此,能从栈获得的空间较小。
堆:堆是向高地址扩展的数据结构,是不连续的内存区域。这是由于系统是用链表来存储的空闲内存地址的,自然是不连续的,而链表的遍历方向是由低地址向高地址。堆的大小受限于计算机系统中有效的虚拟内存。由此可见,堆获得的空间比较灵活,也比较大。
申请效率的比较:栈由系统自动分配,速度较快。但程序员是无法控制的。堆是由new分配的内存,一般速度比较慢,而且容易产生内存碎片,不过用起来最方便。
另外,在WINDOWS下,最好的方式是用Virtual Alloc分配内存,他不是在堆,也不是在栈,而是直接在进程的地址空间中保留一快内存,虽然用起来最不方便。但是速度快,也最灵活
堆和栈中的存储内容栈:在函数调用时,第一个进栈的是主函数中函数调用后的下一条指令(函数调用语句的下一条可执行语句)的地址,然后是函数的各个参数,在大多数的C编译器中,参数是由右往左入栈的,然后是函数中的局部变量。注意静态变量是不入栈的。当本次函数调用结束后,局部变量先出栈,然后是参数,最后栈顶指针指向最开始存的地址,也就是主函数中的下一条指令,程序由该点继续运行。 堆:一般是在堆的头部用一个字节存放堆的大小。堆中的具体内容有程序员安排。堆栈结构中,将堆栈段串成一个单向链表,链表中的每一个节点对应一个函数调用,该节点中保存了函数操作所使用的变量信息以及函数的返回地址等,该部分被称之为堆栈帧,各函数需要维护自身的堆栈帧结构1。
堆栈其他定义堆栈是一个特定的存储区或寄存器,它的一端是固定的,另一端是浮动的。对这个存储区存入的数据,是一种特殊的数据结构。所有的数据存入或取出,只能在浮动的一端(称栈顶)进行,严格按照“后进先出”的原则存取,位于其中间的元素,必须在其栈上部(后进栈者)诸元素逐个移出后才能取出。在内存储器 (随机存储器) 中开辟一个区域作为堆栈,叫软件堆栈; 用寄存器构成的堆栈,叫硬件堆栈。堆栈处理器就是一种硬件堆栈相对寄存器文件处理器来讲,它具有很多优点系统复杂度低;精简的指令集;芯片面积小;寻址方式简单;代码体积小;快速的中断响应,子程序调用能力。这些优点使得堆栈处理器在工业控制领域和航空航天领域有着不可替代的地位。
本词条内容贡献者为:
吴晨涛 - 副研究员 - 上海交通大学目标堆栈
图文简介
堆栈是一个不容忽视的概念,堆栈是两种数据结构。堆栈都是一种数据项按序排列的数据结构,只能在一端(称为栈顶(top))对数据项进行插入和删除。目标堆栈是指目标程序的形参、局部变量、返回值和真实数据的存储区。一般目标程序向系统申请,由系统自动分配和回收。
- 来源: 科普中国科学百科
- 上传时间:2018-06-13