为什么通过对象传值调用函数时会产生临时对象?

srxumin 2017-10-04 05:00:15
我们先不说编译器优化这样的话题,还有就是哪些情况下会产生临时对象,这个在网上也是一搜一大把的,不需要再解释了。
我就是想问问为什么编译器设计师一定要加个临时变量过渡进去?比如:调用函数fun(x),就不能直接把x赋值给形参吗?

如果从编译器设计人员的角度思考,我自己想了几个原因,大家能否帮忙分析一下?
一、传参时要调用形参的拷贝构造函数,而这时形参还未定义
二、父子函数间不能跨函数操作,但是编译器通过临时变量修改成引用传入,也算跨函数操作呀
三、因为寄存器太少,只能传地址,所以编译器通过建立临时对象传递引用。

不知道各位大侠是否有些自己的看法?给个指引?
...全文
475 9 打赏 收藏 转发到动态 举报
写回复
用AI写文章
9 条回复
切换为时间正序
请发表友善的回复…
发表回复
真相重于对错 2017-10-06
  • 打赏
  • 举报
回复
如果没有复制的话,先不要考虑什么面向对象,类等等,先按一个整形参数来说明问题 比如如你所说直接把上层函数的变量传入进去。 类似 void test(int a);//一个要求整形参数的函数 void main() { int x =10; test(x) //ok,这里直接把x写人到test函数里面,test函数里面对a的操作直接影响到x,不用复制。 //ps。你是不是这个意思? } 如果是这样 那么,下面的代码如何操作?? void main() { test(1000); //????,这里直接传一个值,如果不让复制的话,怎么办??? }
yi19861209 2017-10-06
  • 打赏
  • 举报
回复
paschen 版主 2017-10-05
  • 打赏
  • 举报
回复
因为按值传递本来就是通过复制传递,你如果不想按值传递,可以按引用,对于小的对象,复制并不会影响多少效率,就算你用引用传递,实际相当于传递的是地址,也会进行一个指针变量的复制
真相重于对错 2017-10-05
  • 打赏
  • 举报
回复
所谓的伪代码是要以直实代码为基础的,而不是自己的主观臆造
赵4老师 2017-10-05
  • 打赏
  • 举报
回复
理解讨论之前请先学会如何观察! 计算机组成原理→DOS命令→汇编语言→C语言(不包括C++)、代码书写规范→数据结构、编译原理、操作系统→计算机网络、数据库原理、正则表达式→其它语言(包括C++)、架构…… 对学习编程者的忠告: 多用小脑和手,少用大脑、眼睛和嘴,会更快地学会编程! 眼过千遍不如手过一遍! 书看千行不如手敲一行! 手敲千行不如单步一行! 单步源代码千行不如单步Debug版对应汇编一行! 单步Debug版对应汇编千行不如单步Release版对应汇编一行! 不会单步Release版对应汇编?在你想单步Release版C/C++代码片断的前面临时加一句DebugBreak();重建所有,然后在IDE中运行。(一般人我不告诉他!单步类的实例“构造”或“复制”或“作为函数参数”或“作为函数返回值返回”或“参加各种运算”或“退出作用域”的语句对应的汇编代码几步后,就会来到该类的“构造函数”或“复制构造函数”或“运算符重载”或“析构函数”对应的C/C++源代码处。 VC调试时按Alt+8、Alt+7、Alt+6和Alt+5,打开汇编窗口、堆栈窗口、内存窗口和寄存器窗口看每句C对应的汇编、单步执行并观察相应堆栈、内存和寄存器变化,这样过一遍不就啥都明白了吗。 对VC来说,所谓‘调试时’就是编译连接通过以后,按F10或F11键单步执行一步以后的时候,或者在某行按F9设了断点后按F5执行停在该断点处的时候。
srxumin 2017-10-04
  • 打赏
  • 举报
回复
引用 2 楼 jianwen0529 的回复:
假设就单纯赋值的说法,那么运行时是不是要为每个形参分配一块内存?那么如果没调用呢,又或者多线程怎么办?
这是编译器内部处理的伪代码: 对于以对象为形参的函数: void foo(X x0) { } X xx; foo(xx); 在函数内提供临时变量 void foo(X& x0)    //修改foo的声明为引用 {    X __temp0;      //声明临时变量__temp0    X::X(__temp0, x0); //调用__temp0的拷贝构造函数    X::~X(__temp0);    //调用__temp0的析构函数  } X xx;         //声明xx X::X(xx);       //调用xx的默认构造函数 foo(xx);       //调用foo,这句既然可以传引用给x0,为什么不能直接传值给x0? X::~X(xx);      //调用xx的析构函数
真相重于对错 2017-10-04
  • 打赏
  • 举报
回复
清楚了解函数是什么?并了解调用它时发生了什么,你就清楚了,否则都是人云亦云
xskxzr 2017-10-04
  • 打赏
  • 举报
回复
就fun(x)这种调用而言就是用x初始化形参,并没有什么临时对象。
幻夢之葉 2017-10-04
  • 打赏
  • 举报
回复
假设就单纯赋值的说法,那么运行时是不是要为每个形参分配一块内存?那么如果没调用呢,又或者多线程怎么办?
幻夢之葉 2017-10-04
  • 打赏
  • 举报
回复
因为不拷贝一个临时副本那么对形参的修改就会影响实参 还有形参不是一个实际存在的变量,对这个形参的操作其实就是对临时副本的操作(这里很雷同别名),这里跟你说的赋值给形参没有什么区别啊

64,642

社区成员

发帖
与我相关
我的任务
社区描述
C++ 语言相关问题讨论,技术干货分享,前沿动态等
c++ 技术论坛(原bbs)
社区管理员
  • C++ 语言社区
  • encoderlee
  • paschen
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
  1. 请不要发布与C++技术无关的贴子
  2. 请不要发布与技术无关的招聘、广告的帖子
  3. 请尽可能的描述清楚你的问题,如果涉及到代码请尽可能的格式化一下

试试用AI创作助手写篇文章吧