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语言。在这种语言中,移动值是一种可接受的模式,编译器实际上确保不能再使用移动的值(作为其所有权概念的一部分)…好的,场景是向量包含多个项,该示例实际上只是说明性的:)