函数引用返回底层分析 —— 栈帧创建与销毁

本文详细探讨了函数调用中的引用返回与传值返回的原理、实际例子、效率比较以及适用场景,强调了避免局部变量引用的重要性。通过代码示例和实验数据,揭示了引用返回在大对象时的优势和局限。

引用:可以理解为给一个变量起别名,或者和该变量共享一块空间

应用:引用传参、引用返回


目录

1、函数栈帧创建与销毁

(1) 准备工作

(2) 函数栈帧创建

(3) 函数栈帧销毁

(4) 小结

2、引用返回

(1) 测试一:

(2) 测试二:

3、引用返回和传值返回的效率比较

4、引用返回的适用范围


这里着重讲引用返回,在说引用返回之前,先说说函数栈帧的创建与销毁

函数栈帧创建时,会忽略寄存器ebx、esi的压栈

1、函数栈帧创建与销毁

(1) 准备工作

我们先准备一段简单的代码

#include <stdio.h>

int Add(int x,int y)
{
    int z = x + y;
    return z;
}

int main(){
    int a = 10;
    int b = 20;
    int ret = Add(a,b);
    return 0;
}

(2) 函数栈帧创建

=============== 调用Add函数之前的准备工作 ===============

程序开始运行的时候,OS为在栈上为 main函数开辟一块空间,然后在栈上存放局部变量

到了开始执行Add函数的时候,从右向左读取实参,将实参的拷贝放入寄存器 push 到栈顶

下面要跳转到Add函数,需要先记下 下一条指令的地址0CC2145,也就是 '' return 0;'' 这句代码的地址。即便离家,也得记住家的地址,下次回来知道要回哪

至此,进入Add函数的准备工作已经完成

=============== 执行Add函数 ===============

接下来OS会在栈上为Add函数开辟一块空间,并压到栈顶(栈的大小取决于函数中有多少变量)

评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值