我无法理解c ++移动语义。假设我想从方法返回一个大对象。为了使这个操作有效,我使用大型对象类的移动构造函数。我调用一个方法来获取一个大对象并将其传递给另一个将处理它的方法。
processLargeObject(getLargeObject());
我编写了一个方法getLargeObject()
,我创建了一个大对象。如果我在没有new运算符的情况下创建对象,我会理解存储是在堆栈上分配的。在我事先知道对象大小并且我在数组中表示它的情况下,这个大对象可以定义为double foo[1000000000];
。现在在移动构造函数中,如果我说
foo = other.foo;
然后移动的对象仍然驻留在堆栈上,并且可以在堆栈扩展时被覆盖。
所以这不一定是如何使用移动构造函数。移动构造函数是否应仅用于移动驻留在堆上的对象?
答案 0 :(得分:2)
移动构造函数如何工作?
移动构造函数应该执行浅副本 - 而不是复制构造函数应该执行的深副本。除了做一个浅拷贝,移动构造函数"窃取"移动对象指向的任何资源(例如外部存储器缓冲区,例如std::vector
拥有的缓冲区)。
为了使这个操作有效,我使用了一个大型对象类的移动构造函数。
迂腐地说,对象本身的大小并不会使移动比复制更有效。当对象指向某个可能被盗的大型资源时,移动是有效的。#34;。如果你的意思是这样的外部资源是什么使对象"大",那么足够公平。
移动构造函数是否应仅用于移动驻留在堆上的对象?
无论对象存储在何处 - 无论是自动,动态还是静态,都可以移动它。只要类型是可移动的。
这个大对象可以定义为
double foo[1000000000];
这是一个非常大的对象的一个很好的例子,它没有指向任何可能被盗的外部资源。移动一组双打与复制它完全相同。