C++为什么一定要返回临时变量,假如不返回可以吗

C++语言 码拜 7年前 (2017-04-13) 962次浏览
如下简单代码:

int foo()
{
	int a = 5;
	return a;
}
int main()
{
	int b;
	b = foo();
	return 0;
}

本人看了下里面的汇编,在foo()中有下面几行代码:

	int a = 5;
009E17CE  mov         dword ptr [a],5  
	return a;
009E17D5  mov         eax,dword ptr [a]  

问题1:这个eax是不是就是所谓的临时变量?
问题2:其它语言也和C++一样,需要临时变量来实现函数返回值吗?

解决方案

2

编译器有优化选项,优化级别高一点可以优化掉

2

编译的时候加上-o 或-o2,然后再看看

1

看看汇编语言吧

30

来少年 看debug的完整函数汇编代码
int foo()
{
00CB7200  push        ebp
00CB7201  mov         ebp,esp
00CB7203  sub         esp,0CCh
00CB7209  push        ebx
00CB720A  push        esi
00CB720B  push        edi
00CB720C  lea         edi,[ebp+FFFFFF34h]
00CB7212  mov         ecx,33h
00CB7217  mov         eax,0CCCCCCCCh
00CB721C  rep stos    dword ptr es:[edi]
int a = 5;
00CB721E  mov         dword ptr [ebp-8],5
return a;
00CB7225  mov         eax,dword ptr [ebp-8]
}
问题1:这个eax是不是就是所谓的临时变量?
本人只想说 在c/c++中 99%的情况, 都是利用eax来保存函数的返回值,
然后调用函数的地方需要保存函数返回值,  会从eax读取函数的
b = foo();
00CB725E  call        00CB5785
00CB7263  mov         dword ptr [ebp-8],eax
如你的变量b 就是将eax的值去保存到b中 其中那这个[ebp-8]就是b的地址
所以eax这个东西是负责保存函数返回值
至于临不临时变量, 只能说eax保存了你这个临时变量a的值, 仅此而已
而所谓的a不过是ebp-8, 也就是esp sub出来的一个临时的地址
int a = 5;
00CB721E  mov         dword ptr [ebp-8],5
函数结束之后 肯定
00CB722B  mov         esp,ebp
00CB722D  pop         ebp
堆栈又平衡了  esp sub出去的地址又add回来了
问题2:其它语言也和C++一样,需要临时变量来实现函数返回值吗?
理由见上, 统一由eax保存函数返回值

5

执行foo函数时,a是作为一个局部变量,存储在栈中,然后函数的返回值会存储到寄存器eax,函数返回后释放局部变量(也就是释放栈中的变量),但是返回的这个值是存储在寄存器所以是可以获取到函数的返回值的。

CodeBye 版权所有丨如未注明 , 均为原创丨本网站采用BY-NC-SA协议进行授权 , 转载请注明C++为什么一定要返回临时变量,假如不返回可以吗
喜欢 (0)
[1034331897@qq.com]
分享 (0)