由于我们在C++中移动了语义,所以现在通常这样做
void set_a(A a) { _a = std::move(a); }
Run Code Online (Sandbox Code Playgroud)
原因是,如果a是左值,则副本将被删除,并且只有一个移动.
但如果a是左值,会发生什么?似乎将有一个复制结构,然后是一个移动赋值(假设A有一个适当的移动赋值运算符).如果对象具有太多成员变量,则移动分配可能成本很高.
另一方面,如果我们这样做
void set_a(const A& a) { _a = a; }
Run Code Online (Sandbox Code Playgroud)
只有一个副本分配.如果我们传递左值,我们可以说这种方式优于传值的习语吗?
假设我有以下类,它有一个方法set_value.哪种实施更好?
class S {
public:
// a set_value method
private:
Some_type value;
};
Run Code Online (Sandbox Code Playgroud)
void S::set_value(Some_type value)
{
this->value = std::move(value);
}
Run Code Online (Sandbox Code Playgroud)
void S::set_value(const Some_type& value)
{
this->value = value;
}
void S::set_value(Some_type&& value)
{
this->value = std::move(value);
}
Run Code Online (Sandbox Code Playgroud)
第一种方法只需要定义一种方法,而第二种方法需要两种方法.
但是,第一种方法似乎效率较低:
而对于第二种方法,仅执行一次分配操作.
那么,哪种实施更好?或者它是否重要?
还有一个问题:以下代码是否等同于第二种方法中的两个重载方法?
template <class T>
void S::set_value(T&& value)
{
this->value = std::forward<T>(value);
}
Run Code Online (Sandbox Code Playgroud)