函数返回临时对象时有没有调用拷贝构造函数?

发布于 2022-09-04 00:31:46 字数 1396 浏览 15 评论 0

函数返回临时对象时,有没有进行拷贝?会不会调用拷贝构造函数?
以下两段代码的区别只是一个显式定义了拷贝构造函数,一个没有定义,MSVC2013编译后运行的结果不同。但是可以从结果中看出,第一个并没有调用拷贝构造函数,到底是什么导致两者不同的结果呢?

代码一:

#include <iostream>

class A{
public:
    A(){ std::cout << this << " created" << std::endl; }
    ~A(){ std::cout << this << " destroied" << std::endl; }
    A(const A& a){ std::cout << "copy " << &a << " to " << this << std::endl; }// here is the difference
    void fn(){ std::cout << this << " call fn" << std::endl; }
};

A fn()
{
    A a;
    return a;
}

int main()
{
    A& a = fn();
    a.fn();
    return 0;
}

实际运行结果:

0079FC7B created
0079FC7B call fn
0079FC7B destroied

代码二:

#include <iostream>

class A{
public:
    A(){ std::cout << this << " created" << std::endl; }
    ~A(){ std::cout << this << " destroied" << std::endl; }
    void fn(){ std::cout << this << " call fn" << std::endl; }
};

A fn()
{
    A a;
    return a;
}

int main()
{
    A& a = fn();
    a.fn();
    return 0;
}

实际运行结果:

00EFF94B created
00EFF94B destroied
00EFF967 call fn
00EFF967 destroied

已找到没有调用拷贝构造函数的可能原因:使用Release方式进行编译的

如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。

评论(3

身边 2022-09-11 00:31:46

首先,我用g++不能编译你的代码,A& a = fn();这一句报错:用类型为‘A’的右值初始化类型为‘A&’的非常量引用无效。

把引用去掉后(A a = fn();)发现还是没有调用copy constructor。网上查了一下发现这叫“copy elision”,就是说copy constructor即使有副作用还是会被编译器优化掉的。

南…巷孤猫 2022-09-11 00:31:46

一般都会被优化掉, 有可能即使你没有开优化选项.
这是进步, 有缺陷的东西, 为什么还要保留呢. 优化才是正确的选择.

~没有更多了~
我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
原文