Chinaunix首页 | 论坛 | 博客
  • 博客访问: 2418653
  • 博文数量: 392
  • 博客积分: 7040
  • 博客等级: 少将
  • 技术积分: 4138
  • 用 户 组: 普通用户
  • 注册时间: 2009-06-17 13:03
个人简介

范德萨发而为

文章分类

全部博文(392)

文章存档

2017年(5)

2016年(19)

2015年(34)

2014年(14)

2013年(47)

2012年(40)

2011年(51)

2010年(137)

2009年(45)

分类: C/C++

2013-09-07 11:00:31

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


如题,再看“有闲人对设计新的语言感兴趣的么?一起来讨论一下吧。”这个帖子的时候,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不会被执行?
阅读(1264) | 评论(0) | 转发(0) |
给主人留下些什么吧!~~