我应该在返回 std::vector 的函数上使用 std::move 吗?
Should I use std::move on functions returning std::vector?
考虑这样一个函数:
std::vector<int> generateVector() {
return std::vector<int>(10, 0);
}
像这样调用 generateVector() 有什么好处吗:
std::vector<int> v = std::move(generateVector());
..或者这种移动优化现在由编译器自动完成吗?
std::move
的目的是将左值变成右值。在你的例子中,generateVector()
已经是一个右值,所以它是多余的。
函数调用的结果 returns 对象已经是 rvalue,因此应用 std::move
没有任何好处。
事实上这可能是一种悲观:没有std::move
,变量直接从临时初始化,因此临时(和移动)可以省略。
两者都不是:
没有任何好处。
编译器除了编译C++外没有做任何特别的事情。它可能会尝试做好这件事。
幸运的是,表达式 generateVector()
已经是一个右值,所以 v
将使用移动构造函数构造,但实际上你对 v
的声明和对 generateVector
受复制省略的影响,因此可以将构造视为等同于:
std::vector<int> v(10, 0);
换句话说,语言规则明确允许在这些情况下不调用复制构造函数,即使它们有副作用。
考虑这样一个函数:
std::vector<int> generateVector() {
return std::vector<int>(10, 0);
}
像这样调用 generateVector() 有什么好处吗:
std::vector<int> v = std::move(generateVector());
..或者这种移动优化现在由编译器自动完成吗?
std::move
的目的是将左值变成右值。在你的例子中,generateVector()
已经是一个右值,所以它是多余的。
函数调用的结果 returns 对象已经是 rvalue,因此应用 std::move
没有任何好处。
事实上这可能是一种悲观:没有std::move
,变量直接从临时初始化,因此临时(和移动)可以省略。
两者都不是:
没有任何好处。
编译器除了编译C++外没有做任何特别的事情。它可能会尝试做好这件事。
幸运的是,表达式 generateVector()
已经是一个右值,所以 v
将使用移动构造函数构造,但实际上你对 v
的声明和对 generateVector
受复制省略的影响,因此可以将构造视为等同于:
std::vector<int> v(10, 0);
换句话说,语言规则明确允许在这些情况下不调用复制构造函数,即使它们有副作用。