gpt4 book ai didi

c++ - 我应该始终为函数和方法实现 move 语义吗?

转载 作者:搜寻专家 更新时间:2023-10-31 00:55:56 25 4
gpt4 key购买 nike

用 move 重载 set(/*args*/) 是否有意义?:

//example:
class Person {
private:

//properties
std::string name;
std::string address;
std::string favmovie;

public:

//set without operator=
void set(const std::string& name, const std::string& address, const std::string& favmovie) {
this->name = name;
this->address = address;
this->favmovie = favmovie;

return;
}

//set without operator=
void set(std::string&& name, std::string&& address, std::string&& favmovie) {
this->name = std::move(name);
this->address = std::move(address);
this->favmovie = std::move(favmovie);

return;
}

Person(const std::string& name, const std::string& address, const std::string& favmovie)
: name(name), address(address), favmovie(favmovie) {

}

Person(std::string&& name, std::string&& address, std::string&& favmovie)
: name(std::move(name)), address(std::move(address)), favmovie(std::move(favmovie)) {

}

};

感觉就像是复制和粘贴并进行了一些编辑,但我对每个功能或方法都这样做,目的是为了使它们具有高性能。但这是一个好的做法吗?

最佳答案

@M.M 的回答有一个缺点,即每次调用 set 时都会重新分配存储空间,而通过引用传递参数将允许数据简单地进行复制分配,而无需重新分配其容量已经足以保存通过参数传入的数据。参见 Herb Sutter's CppCon talk更多细节。所以我会推荐

void set(const std::string &name, const std::string &adress, const std::string &favmovie)
{
this->name = name;
this->adress = adress;
this->favmovie = favmovie;
}

构造函数可以使用聪明的按值传递技巧,但除非它是真正的低级代码,否则优化可能不值得,IMO。

关于c++ - 我应该始终为函数和方法实现 move 语义吗?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/40822965/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com