我刚刚学习完关于lvalues,rvalues,move构造函数和move运算符的知识。 我可以看到使用带有rvalues性能和代码的move构造函数的附加价值。 但是我看不出使用move运算符和move构造函数以及lvalues的附加价值,当然在代码方面有附加价值,但是我们不能使用其他一些技术(例如指针)来为lvalues实现相同的功能吗。 所以我的问题是:在性能方面,将move运算符和move构造函数一起使用有什么附加价值。 谢谢你看我的问题。
示例:
class string{
public:
char* data;
string(){
data = nullptr;
}
string(const char* p)
{
size_t size = std::strlen(p) + 1;
data = new char[size];
std::memcpy(data, p, size);
}
~string()
{
delete[] data;
}
string(const string& that)
{
size_t size = std::strlen(that.data) + 1;
data = new char[size];
std::memcpy(data, that.data, size);
}
string(string&& that)
{
data = that.data;
that.data = nullptr;
}
string movee(string &that){
data = that.data;
that.data = nullptr;
}};
性能方面的区别是什么:
string s1("test");
string s2(std::move(s1));
string s1("test");
string s2 = string();
s2.movee(s1);
您可以使用带有指针的间接方式来实现相同的功能。 的确,我们曾经这样做过,即使是现在,这也正是您的移动构造函数/赋值运算符内部正在发生的事情!
是的,当您std::move
一个变量时,最大的好处在于代码的整洁度。 但这并非毫无意义。 使用move构造函数/赋值运算符窃取资源使我们能够灵活,快速地完成这一任务,而不会受到黑客攻击或任何性能损失。 您的代码将更易维护,更容易合理化。 您将更不愿意添加额外的间接层,动态地分配不需要动态分配的东西,只为了获得以任何方式都可以理解的代码,因为现在这样做不会有任何好处。
但是! 不要忘记,您的标准容器正在幕后为您做这件事,例如当std::vector
调整大小时。 那可是很值钱的。 如果我们只能从暂时的状态中走出来,那将是不可能的,我们手中将浪费大量的机会。
与临时工一起做其实没什么不同; 只是您无需键入std::move
即可完成此操作。