相关疑难解决方法(0)

传值和后移是构建一个不好的习惯吗?

由于我们在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)

只有一个副本分配.如果我们传递左值,我们可以说这种方式优于传值的习语吗?

c++ pass-by-value rvalue-reference move-semantics c++11

63
推荐指数
4
解决办法
1万
查看次数

通过值和移动,或两种方法

假设我有以下类,它有一个方法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)

第一种方法只需要定义一种方法,而第二种方法需要两种方法.

但是,第一种方法似乎效率较低:

  1. 根据传递的参数复制/移动参数的构造函数
  2. 移动作业
  3. 参数的析构函数

而对于第二种方法,仅执行一次分配操作.

  1. 复制/移动分配取决于调用哪个重载方法

那么,哪种实施更好?或者它是否重要?

还有一个问题:以下代码是否等同于第二种方法中的两个重载方法?

template <class T>
void S::set_value(T&& value)
{
  this->value = std::forward<T>(value);
}
Run Code Online (Sandbox Code Playgroud)

c++ move-semantics perfect-forwarding c++11

5
推荐指数
1
解决办法
562
查看次数