C++工程实战入门笔记15-移动语义
代码1
#include<iostream>
#include<vector>
using namespace std;class Data
{
public:Data() { cout << "create Data..." << endl; }~Data() { cout << "drop Data..." << endl; }
};void TestData(vector<Data> d) {}int main()
{{vector<Data> datas(3);//创建3个Data对象}system("pause");
}
创建3个Data对象,三次create,三次drop。
代码2
在main函数中加入TestData(datas)
int main()
{{vector<Data> datas(3);//创建3个Data对象TestData(datas);}system("pause");
}
TestData(vector d) 用值传递,会把 datas 这整个 vector 拷贝一份传进函数。拷贝 vector 时,它会为每个元素再构造一份副本。
代码3
修改class
class Data
{
public:Data() { cout << "create Data..." << endl; }Data(const Data&d) { cout << "copy Data" << endl; }~Data() { cout << "drop Data..." << endl; }
};
解释:
vector<Data> datas(3); // create×3
TestData(datas); // vector 拷贝 → copy×3 + drop×3// (函数结束时形参析构)
代码4
把main函数中TestData(datas)
改成TestData(move(datas))
TestData(datas); // 按值传参(拷贝 vector)
TestData(std::move(datas)); // 按值传参,但传的是右值(移动 vector)
代码5
观察size
#include<iostream>
#include<vector>
using namespace std;//移动语义测试
//vectorclass Data
{
public:Data() { cout << "create Data..." << endl; }Data(const Data&d) { cout << "copy Data" << endl; }~Data() { cout << "drop Data..." << endl; }
};void TestData(vector<Data> d)
{cout << "In TestData = " << d.size() << endl;
}int main()
{{vector<Data> datas(3);//创建3个Data对象//TestData(datas);TestData(move(datas));//move转为右值引用cout << "after move = " << datas.size() << endl;}system("pause");
}