从如下的文章可知,函数返回一个对象时,并不一定会调用拷贝构造函数,编译器可能对其进行优化
如果调用了拷贝构造函数,则会生成一个临时变量,临时变量使用完后会消除该变量,也就是执行析构
如题,再看“有闲人对设计新的语言感兴趣的么?一起来讨论一下吧。”这个帖子的时候,gtkmm举了如下的例子
-
class T
-
{
-
public:
-
T(){}
-
T(const T&){
-
throw 0;
-
}
-
};
-
-
T test( int i)
-
{
-
T t1,t2;
-
return t1;
-
return t2;
-
}
-
-
int main(int argc, char *argv[])
-
{
-
T t = test(0);
-
return 0;
-
}
复制代码
试
了下,确实如果有两个return,就会调用复制构造函数,导致抛出异常终止程序。但只有一个的话,就正常。然后查了下,原来g++在用函数返回值初始化
一个类的时候,倾向于不调用复制构造函数,而是直接把函数中的局部变量当成新的变量用,具体到这里,可以看到当只有一个return存在的时候,test
中的局部变量 t1 和main中的 t 地址是一样的。通过比较地址和查看汇编码,看来这种情况下,main创建 t 并隐式的把对 t 的引用传递给
test ,并在test中当 t1 用(换句话说test中的 t1 就是对 main中的 t
的引用),所以避免了复制构造函数的调用(我之前以为是test返回的时候把对t1的引用返给main,但显然不对,test结束局部变量t1就没有意义
了)
问题是为什么多一个return就会导致不使用这种优化行为?明明那个return不会被执行?
阅读(1345) | 评论(0) | 转发(0) |