- 论坛徽章:
- 0
|
如题,再看“有闲人对设计新的语言感兴趣的么?一起来讨论一下吧。”这个帖子的时候,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不会被执行? |
|