【发布时间】:2016-10-24 07:03:21
【问题描述】:
我无法理解 C++ 移动语义。假设我想从一个方法返回一个大对象。为了使这个操作高效,我为大对象类使用了一个移动构造函数。我调用一个方法来获取一个大对象并将它传递给另一个将处理它的方法。
processLargeObject(getLargeObject());
我编写了一个方法getLargeObject(),在其中创建了一个大对象。如果我在没有 new 运算符的情况下创建对象,我会明白存储是在堆栈上分配的。在我事先知道对象的大小并用数组表示的情况下,这个大对象可以定义为double foo[1000000000];。现在在移动构造函数中,如果我说
foo = other.foo;
那么被移动的对象仍将驻留在堆栈中,并且可以随着堆栈的扩展而被覆盖。
所以这不能是移动构造函数的使用方式。移动构造函数是否应该仅用于移动位于堆上的对象?
【问题讨论】:
-
如果
foo是一个双精度数组,foo = other.foo;将不会编译。无论如何,您将如何移动一个普通的双精度数组? -
这是否意味着我必须遍历数组并创建一个副本?
-
您是否尝试过声明和使用一个在普通数组中包含十亿双精度数的对象?似乎是溢出堆栈的好方法。你应该使用
vector<double>然后移动才有意义。 -
我认为向量的实现方式,由于它的移动构造函数,它会被移动。我只是想了解移动语义。
-
移动该数组的内容不是你想要的吗?
vector会为你做这件事。阅读this,它有一些关于移动语义的好答案。
标签: c++ c++11 move-semantics