在某些情况下,当我通过回调从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成员变量吗?只是为了确保不做任何复制,否则会导致巨大的处理成本?
答案 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::vector
,std::string
和
std::unique_ptr
由库实现者设计,可以转移
资源(例如内存)的所有权。
这意味着,对于堆栈分配的POD,无法避免
复印件。如果该操作对性能至关重要,并且复制是不可接受的,
解决方案可能是首先没有堆栈分配的POD,因为
例如,将对象粘贴在std::unique_ptr
中。
另一种选择是仅拥有目标对象,然后让其他人“访问”
该对象通过指针或引用。