move函数是将一个左值强转成T&&,T&&就相当于右值,这样在进行拷贝构造或者复制运算时就可以减少临时对象的内存空间的开辟。move应用最多的场景就是在STL中,下面展示一下move与不用move的区别:
#include <iostream>
#include <cstring>
#include <cstdlib>
#include <vector>
using namespace std;
class Str {
public:
char *str;
Str(char value[])
{
cout << "普通构造函数..." << endl;
str = NULL;
int len = strlen(value);
str = (char *)malloc(len + 1);
memset(str, 0, len + 1);
//strcpy(str, value);
memcpy(str, value, len);
}
Str(const Str &s)
{
cout << "拷贝构造函数..." << endl;
str = NULL;
int len = strlen(s.str);
str = (char *)malloc(len + 1);
memset(str, 0, len + 1);
//strcpy(str, s.str);
memcpy(str, s.str, len);
}
Str(Str &&s)
{
cout << "移动构造函数..." << endl;
str = NULL;
str = s.str;
s.str = NULL;
}
~Str()
{
cout << "析构函数" << endl;
if (str != NULL)
{
free(str);
str = NULL;
}
}
};
int main()
{
char value[] = "I love zx";
Str s(value);//调用构造函数
vector<Str> vs;
vs.push_back(move(s));
//vs.push_back(s); //调用拷贝构造函数
cout << vs[0].str << endl;
if (s.str != NULL)//move之后s.str的值会被转移掏空
cout << s.str << endl;
system("pause");
return 0;
}
//vs.push_back(move(s));
//vs.push_back(s); //调用拷贝构造函数
这两行代码调用的函数不用,第一个使用move函数对str复制,也就是浅拷贝,第二个会先拷贝一个s的临时对象再进行值拷贝,创建s的临时对象需要另外开辟内存空间,消耗资源。总结完毕