C++函数调用的压栈过程

以例子进行讲解

#include <iostream>
using namespace std;

int f(int n) 
{
	cout << n << endl;
	return n;
}

void func(int param1, int param2)
{
	int var1 = param1;
	int var2 = param2;
	printf("var1=%d,var2=%d", f(var1), f(var2));//如果将printf换为cout进行输出,输出结果则刚好相反
}

int main(int argc, char* argv[])
{
	func(1, 2);
	return 0;
}
//输出结果
//2
//1
//var1=1,var2=2
  • 从入口函数main函数开始执行时,编译器会将操作系统的运行状态,main函数的返回地址、main的参数、mian函数中的变量、进行依次压栈;
  • 当main函数开始调用func()函数时,编译器此时会将main函数的运行状态进行压栈,再将func()函数的返回地址、func()函数的参数从右到左、func()定义变量依次压栈;
  • 当func()调用f()的时候,编译器此时会将func()函数的运行状态进行压栈,再将的返回地址、f()函数的参数从右到左、f()定义变量依次压栈
  • 函数f(var1)、f(var2)依次入栈,而后先执行f(var2),再执行f(var1),最后打印整个字符串,将栈中的变量依次弹出,最后主函数返回。

文字化表述

  • 从栈空间分配存储空间
  • 从实参的存储空间复制值到形参栈空间
  • 进行运算
posted @ 2023-02-21 13:57  小秦同学在上学  阅读(104)  评论(0编辑  收藏  举报