考虑一个场景:
#include <iostream>
#include <cstring>
class String
{
private:
char *m_Data;
unsigned m_Size;
public:
String();
String(const char* p)
{
m_Size = strlen(p)+1;
m_Data = new char[m_Size];
memcpy(m_Data, p, m_Size);
printf("Created!\n");
}
String(const String& other)
{
m_Size = other.m_Size;
m_Data = new char[m_Size];
memcpy(m_Data, other.m_Data, m_Size);
printf("Copied!\n");
}
~String()
{
delete[] m_Data;
printf("Destroyed!\n");
}
};
class Entity
{
private:
String m_Name;
public:
Entity(const String& name)
: m_Name(name)
{
}
};
int main()
{
Entity entity(String("Wang"));
printf("entity created\n");
system("pause");
}
运行结果:
Created!
Copied!
Destroyed!
entity created
我们发现复制了两次内存,太不划算了,有没有办法利用已有的内存?
利用右值引用,我们可以降低到只拷贝一次:
#include <iostream>
#include <cstring>
class String
{
private:
char *m_Data;
unsigned m_Size;
public:
String();
String(const char* p)
{
m_Size = strlen(p)+1;
m_Data = new char[m_Size];
memcpy(m_Data, p, m_Size);
printf("Created!\n");
}
String(const String& other)
{
m_Size = other.m_Size;
m_Data = new char[m_Size];
memcpy(m_Data, other.m_Data, m_Size);
printf("Copied!\n");
}
~String()
{
delete[] m_Data;
printf("Destroyed!\n");
}
/* NEW: constructor */
String(String&& other) noexcept
{
m_Size = other.m_Size;
m_Data = other.m_Data;
m_Size = 0;
m_Data = nullptr; // make sure m_Data won't be deleted by Destructor
printf("Moved!\n");
}
};
class Entity
{
private:
String m_Name;
public:
Entity(const String& name)
: m_Name(name)
{
}
/* NEW: move constructor */
Entity(String&& name)
: m_Name(std::move(name))
// : m_Name((String&&)name) // equivalent; must explicitly convert the type into String&&
{
}
};
int main()
{
Entity entity(String("Wang"));
printf("entity created\n");
system("pause");
}
运行结果:
Created!
Moved!
Destroyed!
entity created