临时变量的一些细节

一 :临时变量产生之值传递::(值传递包括指针传递)

1 。非引用的参数传递 :实参有自己的变量空间,当开始调用函数时, 形参并不会自己申请内存单元,在传递(内置类型)实参时,先将实参的值放到寄存器中,再执行push eax指令,对参数进行压栈

在执行”main函数语句中的Add(a,b)函数时”先进行以下的步骤:
:mov eax,dword ptr[ebp - 8] //mov ebp -8 放到eax里面,即将b放到寄存器里面

                             push eax            
                             mov  eax,dword ptr[ebp - 8] 
                             push eax          
                004010A5     call @ILT+0(Add) (00401005)
                004010AA     add  esp, 8

//参数压栈取决于函数的调用约定

push eax //先对参数b进行压栈,再对a进行压栈,在main函数的edi栈顶上面生成两个空间,先是b,再是a的空间

接下来执行call指令:相当于在栈顶上又push了一次,这个时候这个空间存放的就是  :004010AA   即call指令下一条指令的地址
程序往下执行就会跳到Add(int x, int y)所调用函数所在的位置,
**由前面可知:在调用这个函数之前,将先给实参创建临时变量**。
//形参变量只有在被调用时才分配内存单元,分配的内存单元就是前面在调用该函数时push a , b出来的空间,在调用结束时,先释放Add函数的栈空间,再释放调用该函数时所开辟的内存单元。

2 。 返回值:以值传递的形式进行返回,会产生一个临时变量,这个临时变量会对m*2的值进行拷贝,然后return就会返回该临时变量的值,一般对于int这样的内置类型,直接将返回值存放的eax寄存器,然后从寄存器里面赋值到main函数中的变量就是了。当然正常来说是需要一个临时变量保存,然后在从临时变量move到main函数中的变量

二 :临时变量产生之常量引用
double b = 1.2
int& a = b; //错误,因为这种方式将产生一个临时变量,而临时变量具有常性,也就是说a引用的是带有常性的临时变量
const int& a = b;//所以需要用const修饰,此时的a是这个临时变量的名字,与b将没有关系,不论怎么修改b,都不会影响a。当然a并不能被修改

附;
强制类型转换:一定会产生临时变量
这里写图片描述
:此时我将double类型的变量c进行强转,如果没有产生临时变量的话,那么相当于我改变了c,下一语句输出的一定和强转的那条语句是同一值,但是结果如下:
这里写图片描述
所以说,当强制类型转换的时候一定会产生临时变量

  • 1
    点赞
  • 8
    收藏
    觉得还不错? 一键收藏
  • 5
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 5
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值