函数调用时发生了什么?

20 篇文章 0 订阅

我们以如下代码示例,描述函数调用过程中,栈的操作过程:

void f(){
  int x = g(1);
  x++; //g函数返回,当前堆栈顶部为f函数栈帧,在当前栈帧继续执行f函数的代码。
}
int g(int x){
  return x + 1;
}

每次函数调用,操作系统都会在栈中创建一个栈帧(stack frame)。正在执行的函数参数、局部变量、申请的内存地址等都在当前栈帧中,也就是堆栈的顶部栈帧中。如下图所示:
在这里插入图片描述
当 f 函数执行的时候,f 函数就在栈顶,栈帧中存储着 f 函数的局部变量,输入参数等等。当 f 函数调用 g 函数,当前执行函数就变成 g 函数,操作系统会为 g 函数创建一个栈帧并放置在栈顶。当函数 g() 调用结束,程序返回 f 函数,g 函数对应的栈帧出栈,顶部栈帧变又为 f 函数,继续执行 f 函数的代码,也就是说,真正执行的函数永远都在栈顶。而且因为栈帧是隔离的,所以不同函数可以定义相同的变量而不会发生混乱。

如果频繁地进行函数调用,就会频繁地入栈出栈,这种开销并不可以忽略不计,在C++中合理地使用内联函数,可以避免这种函数调用的开销。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值