返回 std::vector 和 std::move
Returning std::vector with std::move
我有一个非常基本的问题:使用 std::move
return a std::vector<A>
是个好主意吗?例如:
class A {};
std::vector<A> && func() {
std::vector<A> v;
/* fill v */
return std::move(v);
}
我应该return std::map
, std::list
..等等...这样吗?
启用优化的 gcc 和 clang 编译器在您 return 局部变量和您编写 std::move()
时为这两种情况生成相同的二进制代码。
只是 return 个值。
但是,如果您为自定义 class
创建移动构造函数并移动 operator=
,则使用 &&
和 noexcept
说明符很有用
您通过 r 值引用向 return 声明了一个函数 - 这几乎永远不应该完成(如果您通过引用 return 本地对象,您最终会得到一个悬空引用) .而是按值将函数声明为 return。这样,调用者的值将由函数编辑的右值 return 移动构造。 returned 值也将绑定到任何引用。
其次,不,你应该不 return使用显式std::move
,因为这会阻止编译器使用RVO。没有必要,因为编译器会在可能的情况下自动将任何左值引用 returned 转换为右值引用。
std::vector<A> func() {
std::vector<A> v;
/* fill v */
return v; // 'v' is converted to r-value and return value is move constructed.
}
更多信息:
- Using std::move() when returning a value from a function to avoid to copy
- Is there any case where a return of a RValue Reference (&&) is useful?
不,不是。在某些情况下,这实际上可以防止复制省略。在一些编译器中甚至有一个关于它的警告,称为 -Wpessimizing-move
.
与其他答案一致,只是 return 它的值,将 return 类型更改为 std::vector<A>
,编译器将负责调用移动构造函数需要。
你可以看看我刚刚找到的这个post,它似乎解释得很详细(虽然我自己还没有通读):
https://vmpstr.blogspot.hu/2015/12/redundant-stdmove.html
我有一个非常基本的问题:使用 std::move
return a std::vector<A>
是个好主意吗?例如:
class A {};
std::vector<A> && func() {
std::vector<A> v;
/* fill v */
return std::move(v);
}
我应该return std::map
, std::list
..等等...这样吗?
启用优化的 gcc 和 clang 编译器在您 return 局部变量和您编写 std::move()
时为这两种情况生成相同的二进制代码。
只是 return 个值。
但是,如果您为自定义 class
创建移动构造函数并移动operator=
,则使用 &&
和 noexcept
说明符很有用
您通过 r 值引用向 return 声明了一个函数 - 这几乎永远不应该完成(如果您通过引用 return 本地对象,您最终会得到一个悬空引用) .而是按值将函数声明为 return。这样,调用者的值将由函数编辑的右值 return 移动构造。 returned 值也将绑定到任何引用。
其次,不,你应该不 return使用显式std::move
,因为这会阻止编译器使用RVO。没有必要,因为编译器会在可能的情况下自动将任何左值引用 returned 转换为右值引用。
std::vector<A> func() {
std::vector<A> v;
/* fill v */
return v; // 'v' is converted to r-value and return value is move constructed.
}
更多信息:
- Using std::move() when returning a value from a function to avoid to copy
- Is there any case where a return of a RValue Reference (&&) is useful?
不,不是。在某些情况下,这实际上可以防止复制省略。在一些编译器中甚至有一个关于它的警告,称为 -Wpessimizing-move
.
与其他答案一致,只是 return 它的值,将 return 类型更改为 std::vector<A>
,编译器将负责调用移动构造函数需要。
你可以看看我刚刚找到的这个post,它似乎解释得很详细(虽然我自己还没有通读): https://vmpstr.blogspot.hu/2015/12/redundant-stdmove.html