采用C++11的右值引用来避免拷贝,没有达到我的期望.为什么?
我知道STL的算法对象sort里面,交换两个变量的时候是用的swap.
swap是非常昂贵的,因为要先构造一个temp对象,然后做两次赋值,因此对于复杂的对象而言,就调用了一次拷贝构造函数和两次赋值operator=.
那么C++11的move语义是不是能帮我完全避免这个问题呢? 我试了一下,如下的代码:
struct s{ int i; s():i(11){cout<<"default ctor"<<endl;} s(int ii):i(ii){cout<<"explicit ctor"<<endl;} s(const s& ss){ i=ss.i; cout<<"copy ctor"<<endl; } s& operator=(const s& ss){ i=ss.i; cout<<__FUNCTION__<<endl; return *this; } s(s&&ss){ i=ss.i; cout<<"move semantic"<<endl; }};void swap(s& a, s& b)//重载swap函数,我希望被std::sort调用。{ cout<<"overloaded swap"<<endl; s tmp(move(a)); // 对象a被移动到对象tmp,a被清空 a = move(b); // 对象b被移动到对象a,b被清空 b = move(tmp); // 对象tmp被移动到对象b}int main(void){ s ps[4]={12,13,14,9}; vector<s> vs(ps,ps+_countof(ps)); cout<<"===================="<<endl; sort(vs.begin(),vs.end(), [](const s& t1, const s& t2) {return t1.i<t2.i;}); for_each(vs.begin(),vs.end(), [](const s& ss){cout<<ss.i<<endl;}); return 0; }