我想知道当我不在移动构造函数/移动赋值内时是否有必要显式移动值。可以说我有以下情况:
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 :(得分:1)
您可以避免移动并将其留给对象的初始化和编译器的优化:
struct Node
{
std::vector<int> items;
};
Node create()
{
std::vector<int> items;
// ...
return Node{items};
}
通常的建议是:不要采用过度手动优化。
答案 1 :(得分:0)
只要您记住左值可能不再有效,移动左值就可以了。你可以在它上面复制一些东西但它会再次没问题。
移动向量的内容通常比复制它更快,因为它只需要交换底层指针(和一个大小变量),而不是单独复制向量中的每个元素。移动一些简单的东西,比如int,有点傻。
最后,在你的例子中,明确地肯定不会有害。 items
是一个左值,所以除非你的编译器足够聪明,看不到项目从未再次使用过,否则它可能会使用复制语义,所以显式是有帮助的。