Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/cplusplus/126.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/email/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ 我是否应该移动不再使用的值?_C++_Move Semantics - Fatal编程技术网

C++ 我是否应该移动不再使用的值?

C++ 我是否应该移动不再使用的值?,c++,move-semantics,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 = ite

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

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;
}
struct节点
{
向量项;
};
节点创建()
{
向量项;
项目。推回(2);
节点n;
//我是否应该使用n.items=std::move(items);
//相反?
n、 项目=项目;
//其他代码,不再使用项目
返回n;
}
首先,如果在后续代码中不再使用移动的值,那么使用
std::move
移动左值是否正确


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

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

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


最后,在您的示例中,明确无误<代码>项是一个左值,因此除非您的编译器足够聪明,能够看到项不再被使用,否则它可能会使用复制语义,因此显式将有所帮助。

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

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

Node create()
{
    std::vector<int> items;
    // ...
    return Node{items};
}
struct节点
{
向量项;
};
节点创建()
{
向量项;
// ...
返回节点{items};
}

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

移动比复制好。为什么不早点实例化
n
,直接按
n来省去麻烦。items
?@user4581301是正确的。你能想出一个未经尝试的例子吗?嗯,我不认为这是人为的。。。我最近看了一下rust语言。在这种语言中,移动值是一种可接受的模式,编译器实际上确保不能再使用移动的值(作为其所有权概念的一部分)…好的,场景是向量包含多个项,该示例实际上只是说明性的:)