栈是一种先进后出的数据结构,栈有一个存储区、一个栈顶指针。栈顶指针指向堆栈中第一个可用的数据项(被称为栈顶)。用户可以在栈顶上方向栈中加入数据,这个 *** 作被称为压栈(Push),压栈以后,栈顶自动变成新加入数漏改据项的位置,栈顶指针也随之修改。用户也可以从堆栈中取走栈顶,称为d出栈(pop),d出栈后,栈顶下的一个元返数判素变成栈顶,栈顶指针随之修改。
函数调用时,调用者依次把毕桐参数压栈,然后调用函数,函数被调用以后,在堆栈中取得数据,并进行计算。函数计算结束以后,或者调用者、或者函数本身修改堆栈,使堆栈恢复原装。
对应用程序来说栈空间是不需要申请的,直接就可以拿来使用,而堆空间,是需要向 *** 作系统申请的
对window下面的可执行程序来说
局部变量,是在栈上分配的,每一个应用程序在被装歼粗入内存的时候, *** 作系统都会为这个应用程序分配一个栈空间供应用程序使用,在使用的过程中,不需要申请,或者说,在程序编译之前就可以确定会用到那些栈。
另外,除了局部氏族镇变量,函数调用的时候也需要栈的支持,因穗搭为函数调用返回的时候需要知道返回地址,这个返回地址就是保存在栈中的
在函数调用的时候,某些调用方式比如说stdcall,函数的参数也是经过栈传递给函数的
堆是需要向 *** 作系统申请内存空间的时候才需要的,一般的malloc、new、以及window API HeapAlloc啊GlobalAlloc啊这些 都是向堆申请内存空间的,这些申请的空间在编译阶段是无法确定的,之后在运行的时候才可以知道需要申请多少的内存空间。。
java程序员压根没必要去了解这些,根本没意义。。
javascript和php这些可以说也没有栈和堆的概念
欢迎分享,转载请注明来源:内存溢出
评论列表(0条)