我试图了解移动构造函数,
通常在复制对象时调用复制构造函数
当我不提供移动构造函数时会发生什么,
但是当我添加一个移动构造函数时,它被调用而不是我的复制构造函数
这是我的代码:
#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;
}
编译器是否尝试优化我的代码并选择更好的方法?
答案 0 :(得分:6)
基本上,是的。
然而,这不是关于编译器优化,而是与语言本身的优化方式有关。
移动语义的一半是为了有效利用临时工。这就是为什么temporaries绑定到rvalue refs,这就是整个移动语义的工作原理。当你没有临时但你想移动的东西时,你写std::move
来获得一个右值并触发同样的行为。
当他们即将被摧毁时,没有必要复制这些临时工。
与复制/移动省略相一致,此功能将导致更少的冗余计算。
但是请注意,你的移动构造函数并不是非常有用 - 如果你想让它实际上做某事(比如,嗯,移动那些东西),你必须删除它{{ 1}}。
答案 1 :(得分:2)
rvalue引用是绑定临时值的最佳候选者,而不是const左值引用。它不是关于优化(如在编译器优化中),而是关于遵循标准。实际的优化是根本不调用复制构造函数。