copy/move涉及的是对象内部的数据/状态的复制、转移操作,跟对象的所有权不是一回事。
比如:
对象A内部分配了一个内存缓冲区保存在其成员m_ptr里:
A.m_ptr = new char[12];
对象B如果来copy对象A的话,B内部的m_ptr指向的是一个新分配的内存,而且两个缓冲区内的数据用memcpy搞得完全一样:
B.m_ptr = new char[12];
memcpy(B.m_ptr, A.m_ptr, 12);
对象B如果要由A move得来的话,A内部的缓冲区会转移给B,然后A内部只剩下个空指针:
B.m_ptr = A.m_ptr
A.m_ptr = nullptr;
对比一下上面的copy构造、move构造操作,就知道copy和move哪个操作效率高了。当然前提是在能move的场景下。
用 B{A}; 来声明B的意思就是告诉编译器调用copy ctor
而用 B{std::move(A)}; 来声明B的意思就是告诉编译器调用move ctor。决定权在码农。
【 在 littleSram 的大作中提到: 】
: 不需要到这一层
: 是不是理解了对象所有权就够了
: :
--
修改:z16166 FROM 125.35.123.*
FROM 125.35.123.*