计算机组织中的堆栈框架
堆栈框架:
堆栈是应用程序内存的一部分,用于存储局部变量、函数函数。每当我们的程序中有函数调用时,局部变量和其他函数调用或子例程的内存都会存储在堆栈帧中。每个函数在应用程序内存的堆栈段中都有自己的堆栈帧。
特征 :
- 堆栈中为函数调用分配的内存仅在函数完成后函数执行时才存在,我们无法访问该函数的变量。
- 一旦调用函数完成其执行,它的堆栈帧就会被移除,并且被调用函数的执行线程从它离开的那个位置恢复。
- 堆栈用于存储函数调用,因此当我们在程序中使用大量递归调用时,堆栈内存会被函数调用或子程序耗尽,这可能会导致堆栈溢出,因为堆栈内存是有限的。
- 每个堆栈帧都维护堆栈指针 (SP) 和帧指针 (FP)。栈指针和帧指针总是指向栈顶。它还维护一个程序计数器 (PC),它指向要执行的下一条指令。
- 每当进行函数调用时,都会在堆栈段中创建堆栈帧,调用函数给出的参数会在被调用函数的堆栈帧中获得一些内存,并将它们推入被函数的堆栈帧。当它们的执行完成时,它们会从堆栈帧中弹出。并且执行线程在被调用函数中继续。
栈帧结构:
堆栈指针始终指向顶部,帧指针存储子程序整个堆栈帧的地址。子程序或函数的每个堆栈帧包含以下内容。Stack Frame Other function calls Other saved registers Local variables Saved [Frame Pointer]
Of called functionSaved [Link Register]
Of called functionPassed arguments Frame pointer (F.P)
子程序的典型堆栈帧。
C++ 中的实现:
让我们考虑一个示例程序,以更好地理解堆栈帧。
C++
#include
using namespace std;
//product method
int findProduct(int a, int b)
{
int product = a * b;
return product;
}
//findSum method
int findSum(int a, int b)
{
int sum = a + b;
return sum;
}
//main function
int main()
{
int a = 6;
int b = 6;
//findProduct method called
int product = findProduct(a, b);
//findSum method called
int sum = findSum(a, b);
cout << "Product is :" << product << endl;
cout << "Sum is :" << sum << endl;
return 0;
}
输出 :
Product is :36
Sum is :12
使用 Stack 的解释:
第1步 : findProduct() a = 6 product = a* b
当 main() 调用 findProduct函数时,会创建一个新的堆栈帧,如下所示。
b=6 main()
a = 6
b=6
product = call to findProduct()
sum = call to findSum()
堆
第2步 : main() a = 6
在函数findProduct 完成其指令并返回 main() 后,findProduct 的堆栈帧从堆栈中弹出。之后 main() 调用 findSum()函数。findSum()
a = 6
b=6
sum = a+ b
b=6
product = 36
sum = call to findSum()
堆
第 3 步:
在函数findSum 完成其指令并返回到 main() 之后,findSum() 从堆栈中弹出,如下所示。 main()
a = 6
b=6
product = 36
sum = 12
堆
第4步 :
现在 main()函数执行剩余的语句并从堆栈中弹出,堆栈为空..