2016-06-21 42 views
2

我想知道当我不在移动构造函数/移动任务中时,是否有必要显式移动值。比方说,我有以下情况:我应该移动一个我不再使用的值吗?

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左值的前提是我没有在随后的代码中使用移动价值了吗?

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

+0

移动比复制更好 – vu1p3n0x

+3

为什么不提前实例化'n'并通过直接推入'n.items'节省自己的麻烦? – user4581301

+0

@ user4581301是正确的。你能想出一个非检索的例子吗? –

回答

0

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

移动矢量的内容通常比复制速度快,因为它只需交换基础指针(和大小变量),而不是单独复制矢量中的每个元素。虽然移动一些简单的东西,像一个int,但是有点愚蠢。

最后,在你的例子中,它显然不会受伤。 items是一个左值,所以除非你的编译器足够聪明才能看到项目永远不会再被使用,否则它可能会使用复制语义,所以显式会有所帮助。

+0

那么,场景是矢量包含* more *比一个项目,这个例子真的只是说明:) – hfhc2

1

您可能避免移动,而让编译器的目标和优化的初始化:

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

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

通常的建议是:不要使用overhasty手动优化。