我应该移动一个我不再使用的值吗?

时间:2016-06-21 21:00:46

标签: c++ move-semantics

我想知道当我不在移动构造函数/移动赋值内时是否有必要显式移动值。可以说我有以下情况:

struct Node
{
  std::vector<int> items;
};

Node create()
{
  std::vector<int> items;
  items.push_back(2);

  Node n;
  // should I use n.items = std::move(items);
  // instead?
  n.items = items;

  // other code, not using items any more

  return n;
}

首先,使用std::move移动左值是否正确,前提是我在后续代码中不再使用移动的值?

其次,显式移动值或编译器是否自动检测到值可以移动是否更快?

2 个答案:

答案 0 :(得分:1)

您可以避免移动并将其留给对象的初始化和编译器的优化:

struct Node
{
  std::vector<int> items;
};

Node create()
{
    std::vector<int> items;
    // ...
    return Node{items};
}

通常的建议是:不要采用过度手动优化。

答案 1 :(得分:0)

只要您记住左值可能不再有效,移动左值就可以了。你可以在它上面复制一些东西但它会再次没问题。

移动向量的内容通常比复制它更快,因为它只需要交换底层指针(和一个大小变量),而不是单独复制向量中的每个元素。移动一些简单的东西,比如int,有点傻。

最后,在你的例子中,明确地肯定不会有害。 items是一个左值,所以除非你的编译器足够聪明,看不到项目从未再次使用过,否则它可能会使用复制语义,所以显式是有帮助的。