提问者:小点点

C++std::move()使用lvalues提高性能


我刚刚学习完关于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);

共1个答案

匿名用户

您可以使用带有指针的间接方式来实现相同的功能。 的确,我们曾经这样做过,即使是现在,这也正是您的移动构造函数/赋值运算符内部正在发生的事情!

是的,当您std::move一个变量时,最大的好处在于代码的整洁度。 但这并非毫无意义。 使用move构造函数/赋值运算符窃取资源使我们能够灵活,快速地完成这一任务,而不会受到黑客攻击或任何性能损失。 您的代码将更易维护,更容易合理化。 您将更不愿意添加额外的间接层,动态地分配不需要动态分配的东西,只为了获得以任何方式都可以理解的代码,因为现在这样做不会有任何好处。

但是! 不要忘记,您的标准容器正在幕后为您做这件事,例如当std::vector调整大小时。 那可是很值钱的。 如果我们只能从暂时的状态中走出来,那将是不可能的,我们手中将浪费大量的机会。

与临时工一起做其实没什么不同; 只是您无需键入std::move即可完成此操作。

相关问题


MySQL Query : SELECT * FROM v9_ask_question WHERE 1=1 AND question regexp '(c++std|move|lvalues|提高|性能)' ORDER BY qid DESC LIMIT 20
MySQL Error : Got error 'repetition-operator operand invalid' from regexp
MySQL Errno : 1139
Message : Got error 'repetition-operator operand invalid' from regexp
Need Help?