将对象的值移到另一个,但避免复制

时间:2019-03-05 10:26:24

标签: c++ c++11

在某些情况下,当我通过回调从API得到答复时,我需要将答复对象移动到类成员变量以继续处理。以下代码是否可以达到目标:

class Obj {
public:
 Obj (unit32_t& x, std::string& x, int& data)
{}
... lot of variable .. no pointers
};
class A
{
public:
 A(Obj& r):pvtmemVarTyOfObj(0,"",0) {}
 private:
 Obj pvtmemVarTyOfObj ;
};

void A::GetResponse(Obj&& resp)
{
  //pvtmemVarTyOfObj = std::forward<Obj>(std::move(resp));
   pvtmemVarTyOfObj = std::move(resp);

}

此代码实际上会将resp移到pvtmemVarTyOfObj成员变量吗?只是为了确保不做任何复制,否则会导致巨大的处理成本?

2 个答案:

答案 0 :(得分:1)

只需在此处使用std::move(resp)。您可以肯定地知道resp右值引用,因此您总是想移动。

如果Obj是模板参数,则需要使用std::forward<Obj>(resp)。因为在这种情况下,Obj&&将是通用引用,它可能是 rvalue lvalue引用std::forward可以推断是否可以resp移出。

是否最终执行复制或移动取决于pvtmemVarTyOfObj类别的赋值运算符。如果它仅包含纯数据并且没有分配的资源(例如,通过指针),那么move不会带来任何好处。

答案 1 :(得分:0)

move构造函数和move赋值运算符只能执行它们的操作 编程来完成,由程序员来完成。从技术上讲,它们可以设计为 做任何事情,但是不建议这样做。
相反,它们应设计成使目标对象与 源对象,同时使源对象保持有效状态。
如果您自己不提供移动操作,则将通过以下方式进行合成 成员移动的方式。
移动基本类型(例如int),只需复制即可。
移动许多库类型,例如std::vectorstd::stringstd::unique_ptr由库实现者设计,可以转移 资源(例如内存)的所有权。
这意味着,对于堆栈分配的POD,无法避免 复印件。如果该操作对性能至关重要,并且复制是不可接受的, 解决方案可能是首先没有堆栈分配的POD,因为 例如,将对象粘贴在std::unique_ptr中。
另一种选择是仅拥有目标对象,然后让其他人“访问” 该对象通过指针或引用。