为什么调用移动构造函数而不是复制构造函数

时间:2016-04-15 19:11:44

标签: c++ c++11

我试图了解移动构造函数,

通常在复制对象时调用复制构造函数

当我不提供移动构造函数时会发生什么,

但是当我添加一个移动构造函数时,它被调用而不是我的复制构造函数

这是我的代码:

#include <iostream>
#include <vector>

using namespace std;

struct A
{
    A()
    {
        cout << "A's constructor" << endl;
    }

    A(const A& rhs)
    {
        cout << "A's copy constructor" << endl;
    }

    A(A&& rhs)
    {
        cout << "A's move constructor" << endl;
    }
};

int main() {

    vector<A> v;

    cout << "==> push_back A():";
    v.push_back(A());

    cout << "==> push_back A():" << endl;
    v.push_back(A());

    return 0;
}

编译器是否尝试优化我的代码并选择更好的方法?

2 个答案:

答案 0 :(得分:6)

基本上,是的。

然而,这不是关于编译器优化,而是与语言本身的优化方式有关。

移动语义的一半是为了有效利用临时工。这就是为什么temporaries绑定到rvalue refs,这就是整个移动语义的工作原理。当你没有临时但你想移动的东西时,你写std::move来获得一个右值并触发同样的行为。

当他们即将被摧毁时,没有必要复制这些临时工。

与复制/移动省略相一致,此功能将导致更少的冗余计算。

但是请注意,你的移动构造函数并不是非常有用 - 如果你想让它实际上做某事(比如,嗯,移动那些东西),你必须删除它{{ 1}}。

答案 1 :(得分:2)

rvalue引用是绑定临时值的最佳候选者,而不是const左值引用。它不是关于优化(如在编译器优化中),而是关于遵循标准。实际的优化是根本不调用复制构造函数。