函数调用传形参,何时才会创建临时变量?

sup945 sup945 墨衍会员 · AI 创作全网分发 墨衍智能分发 通过墨衍一键同步至各平台 可同步平台 CSDN微信公众号微博知乎掘金百家号博客园抖音小红书 你的文章也可以这样分发 墨衍会员 ¥399起/年,写一次发全网 我也要 + 加入社区
源代码:

#include <string>
#include <iostream>
using namespace std;
string version1(string s1, string s2);
int main()
{
string input="unix";
string input2="***";
string result;

result = version1(input, input2);
return 0;
}

string version1(string s1, string s2)
{
s1 = s2 + s1 + s2;
return s1;
}

main 函数中作出临时变量的代码
0x0000000000400a7e <+106>: callq 0x400850 <_ZNSsC1Ev@plt>
0x0000000000400a83 <+111>: lea -0x60(%rbp),%rdx
0x0000000000400a87 <+115>: lea -0x30(%rbp),%rax
0x0000000000400a8b <+119>: mov %rdx,%rsi
0x0000000000400a8e <+122>: mov %rax,%rdi

0x0000000000400a91 <+125>: callq 0x400880 <_ZNSsC1ERKSs@plt>
0x0000000000400a96 <+130>: lea -0x70(%rbp),%rdx
0x0000000000400a9a <+134>: lea -0x40(%rbp),%rax
0x0000000000400a9e <+138>: mov %rdx,%rsi
0x0000000000400aa1 <+141>: mov %rax,%rdi

0x0000000000400aa4 <+144>: callq 0x400880 <_ZNSsC1ERKSs@plt>
0x0000000000400aa9 <+149>: lea -0x20(%rbp),%rax
0x0000000000400aad <+153>: lea -0x30(%rbp),%rdx
0x0000000000400ab1 <+157>: lea -0x40(%rbp),%rcx
0x0000000000400ab5 <+161>: mov %rcx,%rsi
0x0000000000400ab8 <+164>: mov %rax,%rdi
0x0000000000400abb <+167>: callq 0x400bc3 <version1(std::string, std::string)>

红色字体为复制input的临时变量,蓝色字体为复制input2的临时变量

version1中收input和input1的代码:
Dump of assembler code for function version1(std::string, std::string):
0x0000000000400bc3 <+0>: push %rbp
0x0000000000400bc4 <+1>: mov %rsp,%rbp
0x0000000000400bc7 <+4>: push %rbx
0x0000000000400bc8 <+5>: sub $0x48,%rsp
0x0000000000400bcc <+9>: mov %rdi,-0x38(%rbp)
0x0000000000400bd0 <+13>: mov %rsi,-0x40(%rbp)
0x0000000000400bd4 <+17>: mov %rdx,-0x48(%rbp)
0x0000000000400bd8 <+21>: lea -0x30(%rbp),%rax
0x0000000000400bdc <+25>: mov -0x40(%rbp),%rdx // copy of input
0x0000000000400be0 <+29>: mov -0x48(%rbp),%rcx // copy of input2


调用version1 函数后的堆栈情况:

0x7fffffffe0c0: 0xffffe270 0x00007fff 0xffffe160 0x00007fff
0x7fffffffe0d0: 0xffffe150 0x00007fff 0xffffe170 0x00007fff
0x7fffffffe0e0: 0xffffe130 0x00007fff 0xffffe130 0x00007fff
0x7fffffffe0f0: 0xffffe160 0x00007fff 0x00000003 0x00000000
0x7fffffffe100: 0x00000010 0x00000000 0x00000000 0x00000000
0x7fffffffe110: 0xffffe190 0x00007fff 0x00400ac0 0x00000000
0x7fffffffe120: 0x00603028 0x00000000 0x00400cb8 0x00000000
0x7fffffffe130: 0x00603058 0x00000000 0x0000ffff 0x00000001
0x7fffffffe140: 0xf7dc74d8 0x00007fff 0x00400ccd 0x00000000
0x7fffffffe150: 0x00603028 0x00000000 0x00400d9d 0x00000000
0x7fffffffe160: 0x00603058 0x00000000 0x00400d40 0x00000000
0x7fffffffe170: 0x00000000 0x00000000 0x00400930 0x00000000
0x7fffffffe180: 0xffffe270 0x00007fff 0x00000000 0x00000000
0x7fffffffe190: 0x00000000 0x00000000 0xf752576d 0x00007fff
0x7fffffffe1a0: 0x00000000 0x00000000 0xffffe278 0x00007fff

0x7fffffffe110: version1 栈顶
0x7fffffffe190: main 栈顶
0x7fffffffe120: main input
0x7fffffffe130: main input2
0x7fffffffe150: copy of main input (临时变量1)
0x7fffffffe160: copy of main input2 (临时变量2)


很清楚的看到 字符串被拷贝了一份后传给了version , 而上述代码如果将string 换为int则完全不会拷贝临时变量传给version,c++传形参时何时创建临时变量,何时不创建,有何规则可依据吗?
...全文

相关推荐

C语言实参、形参、函数调用、指针、引用、&符号实例[定义].pdf

C语言实参、形参、函数调用、指针、引用、&符号实例在C语言中,实参和形参是两个非常重要的概念。实参是指在函数调用时传递给函数的实际参数,而形参是指函数定义中用于接收实参的形式参数。

xhr131452007

C什么叫实参 形参 ?怎么用?区别?

当函数被调用时,系统会根据实参的值来为形参分配内存空间,并将实参的值复制到形参中。需要注意的是,在函数调用过程中,实参的值不会发生改变。

猿声依旧

c语言的形参和实参传递的区别详解

在C语言中,形参(形式参数)和实参(实际参数)之间的数据传递是一个重要的概念,它涉及到函数调用时参数值的传递方式。在程序执行过程中,当我们调用一个函数并传递参数时,实参会将参数值传递给形参。

weixin_38723516

调用形参为二维数组的函数

接下来,我们需要了解如何将这个动态创建的二维数组作为参数传递给一个接受二维数组作为形参的函数。在C/C++中,数组名在函数调用中通常被视为指向数组首元素的指针。

daiding

C语言中形参和实参详解及实例代码

函数调用中发生的数据传送是单向的,即只能把实参的值传送给形参,而不能把形参的值反向地传送给实参。因此在函数调用过程中,形参的值发生改变,而实参中的值不会变化。

weixin_38590309
评论 12
收藏 已收藏
分享
返回顶部
sup945
C++ 语言 65,214 成员 250,514 内容