gpt4 book ai didi

c++ - 使用 "new ClassType(std::move(/*class_object*/))"在 freestore 中构建对象

转载 作者:行者123 更新时间:2023-11-28 07:17:33 25 4
gpt4 key购买 nike

初学者问题:

Class Quote {
public:
/* ..... */

virtual Quote* clone() const & {return new Quote(*this);}

virtual Quote* clone() && {return new Quote(std::move(*this));} // (***)

/* ..... */
}

new 分配的对象在自由存储中。 *this 是调用 clone() 的任何对象,不一定是动态分配的对象。

如果 move 对象和 move 对象位于不同的内存区域, move 机制如何工作?或者也许他们从来没有真正在不同的领域,我错过了什么?

据我所知, move 构造函数创建了新的开销,这些开销链接到移出对象的数据/内存部分。数据本身不会 move/更改。在上述情况下这是如何工作的?如果它以相同的方式工作,那么在 new 运行之后,我们不会有一个动态分配的对象位于自由存储之外(无论 *this 位于?)这是否由 std::move() 以某种方式解决?我不太确定 std::move() 是如何/为什么工作的,除了它会强制返回对命名对象的右值引用,从而可以从该对象 move 对象。

最佳答案

From what I understand, the move constructor creates new overheads that link to the data/memory part of the moved-from object. The data itself is not moved/changed.

不是真的。一个典型的 move 构造函数((我强调典型的因为 move 构造函数真的可以做类编写者想要它做的任何事情)将“窃取”另一个对象远程拥有的资源< em>(例如动态分配的数组),通过重新分配句柄(例如指向动态分配的数组的指针)

当我说资源被远程拥有时,我的意思是它实际上不是类的数据成员。然而,句柄类的数据成员。句柄指的是资源。移至对象和移自对象具有不同的地址和数据成员。他们的数据能够有效地 move ,因为它实际上不是类的一部分,它是由句柄引用的。与资源不同,句柄很小,复制起来也很便宜。 “move ”实际上是将句柄从源对象复制到目标对象,然后使源对象中的句柄无效,使其析构函数不会破坏资源。

How does the move mechanism work if the moved-from and moved-to objects are in different memory areas?

(我再次说的是典型 move 构造函数)这是无关紧要的。无论它们恰好存储在哪里,它们仍然具有相同的内存布局。句柄修改完全相同。当 move 到对象的析构函数被调用时,资源将被释放(除非该对象也被 move )。这意味着当对象超出范围时,如果它在堆栈上,或者当 delete 在指向它的指针上调用时,如果它在自由存储上。 (还有其他的可能性,但这两种显然是最常见的)

关于c++ - 使用 "new ClassType(std::move(/*class_object*/))"在 freestore 中构建对象,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/19997369/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com