C++,函数返回,拷贝构造函数

1520阅读 0评论2013-09-07 jiangwen127
分类:C/C++

从如下的文章可知,函数返回一个对象时,并不一定会调用拷贝构造函数,编译器可能对其进行优化
如果调用了拷贝构造函数,则会生成一个临时变量,临时变量使用完后会消除该变量,也就是执行析构


如题,再看“有闲人对设计新的语言感兴趣的么?一起来讨论一下吧。”这个帖子的时候,gtkmm举了如下的例子
  1. class T
  2. {
  3.     public:
  4.         T(){}
  5.         T(const T&){
  6.         throw 0;
  7.         }
  8. };

  9. T test( int i)
  10. {
  11.     T t1,t2;
  12.     return t1;
  13.     return t2;
  14. }

  15. int main(int argc, char *argv[])
  16. {
  17.     T t = test(0);
  18.     return 0;
  19. }
复制代码
试 了下,确实如果有两个return,就会调用复制构造函数,导致抛出异常终止程序。但只有一个的话,就正常。然后查了下,原来g++在用函数返回值初始化 一个类的时候,倾向于不调用复制构造函数,而是直接把函数中的局部变量当成新的变量用,具体到这里,可以看到当只有一个return存在的时候,test 中的局部变量 t1 和main中的 t 地址是一样的。通过比较地址和查看汇编码,看来这种情况下,main创建 t 并隐式的把对 t 的引用传递给 test ,并在test中当 t1 用(换句话说test中的 t1 就是对 main中的 t 的引用),所以避免了复制构造函数的调用(我之前以为是test返回的时候把对t1的引用返给main,但显然不对,test结束局部变量t1就没有意义 了)

问题是为什么多一个return就会导致不使用这种优化行为?明明那个return不会被执行?
上一篇:复制构造函数(拷贝构造函数)
下一篇:高效解析json例子,Jackson框架