超越函数调用指令的地址推送到堆栈。这是怎样的CPU记住去后,函数返回。
房间是在函数的返回类型的堆栈。这只是一个占位符,现在。
该CPU跳转到该函数的代码。
的栈顶指针是在一个特殊的举行,称为堆栈帧。一切都添加到堆栈之后这一点被认为是“本地”的功能。
所有的函数参数都放在栈。
这个函数的内部指令开始执行。
局部变量推到堆栈上为它们定义。
当函数结束,以下步骤发生:
函数的返回值复制到占位符,被用于此目的的堆栈。
后弹出堆栈帧指针是一切。这破坏了所有的局部变量和参数。
返回值是弹出堆栈和分配作为函数值。如果该函数的值未分配到任何东西,没有分配发生,而失去价值。
要执行的下一条指令的地址是从堆栈中弹出,并继续执行,CPU的指令。
通常情况下,它是不知道如何调用堆栈的作品的重要的细节。然而,理解功能有效地在堆栈上时,他们被称为弹出当他们返回给你需要理解递归的基本原理,以及一些其他的概念是有用的调试时。
堆栈溢出
堆栈的大小有限制,因此只能容纳有限的信息。如果程序试图把太多的信息会导致堆栈,堆栈溢出。堆栈溢出发生在堆栈中的所有内存被分配-在这种情况下,进一步分配开始泛滥到存储器的其它部分。
堆栈溢出通常是分配太多变量在堆栈上的结果,和/或使太多的嵌套的函数调用(在函数调用函数调用函数调用函数D B C等)的堆栈溢出通常会导致程序崩溃。
下面是一个示例程序,导致堆栈溢出。你可以在你的系统崩溃,看它:
这个程序试图分配堆栈上的一个巨大的阵列。由于堆栈不足以处理这个数组,该数组分配内存溢出到部分的程序是不允许使用。因此,程序崩溃。
堆栈的优点和缺点:
存储在堆栈上,停留在范围,只要是在栈。这是破坏时,弹出堆栈。
所有的内存分配在堆栈是在编译时已知。因此,这种记忆可以直接通过变量访问。
由于堆栈是比较小的,通常不是一个好主意,这样吃了大量的堆栈空间的任何东西。这包括分配大的数组,结构,和类,以及沉重的递归。