什么时候需要显式调用 std::move 什么时候不在 cpp 中?
When do you need to explicitly call std::move and when not in cpp?
我正在研究 Stroustrup 的“C++ v2 之旅”。这当然不是一本 C++ 初学者的书,但是很有趣。
我有一个 google 并浏览了 SO 但对这个没有任何兴趣。
现在,我以为我了解编译器何时可以使用移动构造函数,但显然我不了解。在这里,我展示了移动构造函数和我认为会使用它的函数。它没有。仅当我明确使用 std::move 时。为什么是这样?我的理解是本地 r 将在 return.
上隐式“移动”
template<typename T>
Vector<T>::Vector(Vector<T> && a) // move constructor
:elem{a.elem},sz{a.sz}{
a.elem=nullptr;
a.sz=0;
}
template<typename T>
Vector<T> moveVectorAfterAdd(const Vector<T> & v1, const Vector<T> & v2){
Vector<T> r = v1+v2;
return std::move(r);
//return r;
}
int main(void) {
Vector<double> v1(1);
Vector<double> v2=v1;
Vector<double> v3=v2;
Vector<double> v4=moveVectorAfterAdd(v1,v2);
return 0;
}
(附带说明,如果我实际上不使用 std::move,尽管编译时没有优化,lldb 甚至不允许我在移动构造函数中设置断点。)
很高兴收到所有澄清!
When do you need to explicitly call std::move and when not in cpp?
简而言之,技术上精确的话:当你有一个你想成为右值的左值时使用std::move。更实际的是:当有一个你想要的副本而不是移动时,你会想要这样做。因此得名 std::move.
在示例中,您 return 一个自动变量。使用 std::move 无法避免复制,因为在 returning 自动变量的特殊情况下,即使是左值也会有移动。
Here I show the move constructor and the function that I thought would use it. It doesn't.
仅仅因为抽象机中有移动,并不一定意味着会调用移动构造函数。这是一件好事,因为什么都不做可能比调用移动构造函数更快。
这称为(命名)Return 价值优化。或者更一般地复制省略。使用 std::move 会抑制这种优化,因此在这种情况下不仅没有必要,而且还会适得其反。
我正在研究 Stroustrup 的“C++ v2 之旅”。这当然不是一本 C++ 初学者的书,但是很有趣。
我有一个 google 并浏览了 SO 但对这个没有任何兴趣。
现在,我以为我了解编译器何时可以使用移动构造函数,但显然我不了解。在这里,我展示了移动构造函数和我认为会使用它的函数。它没有。仅当我明确使用 std::move 时。为什么是这样?我的理解是本地 r 将在 return.
上隐式“移动”template<typename T>
Vector<T>::Vector(Vector<T> && a) // move constructor
:elem{a.elem},sz{a.sz}{
a.elem=nullptr;
a.sz=0;
}
template<typename T>
Vector<T> moveVectorAfterAdd(const Vector<T> & v1, const Vector<T> & v2){
Vector<T> r = v1+v2;
return std::move(r);
//return r;
}
int main(void) {
Vector<double> v1(1);
Vector<double> v2=v1;
Vector<double> v3=v2;
Vector<double> v4=moveVectorAfterAdd(v1,v2);
return 0;
}
(附带说明,如果我实际上不使用 std::move,尽管编译时没有优化,lldb 甚至不允许我在移动构造函数中设置断点。)
很高兴收到所有澄清!
When do you need to explicitly call std::move and when not in cpp?
简而言之,技术上精确的话:当你有一个你想成为右值的左值时使用std::move。更实际的是:当有一个你想要的副本而不是移动时,你会想要这样做。因此得名 std::move.
在示例中,您 return 一个自动变量。使用 std::move 无法避免复制,因为在 returning 自动变量的特殊情况下,即使是左值也会有移动。
Here I show the move constructor and the function that I thought would use it. It doesn't.
仅仅因为抽象机中有移动,并不一定意味着会调用移动构造函数。这是一件好事,因为什么都不做可能比调用移动构造函数更快。
这称为(命名)Return 价值优化。或者更一般地复制省略。使用 std::move 会抑制这种优化,因此在这种情况下不仅没有必要,而且还会适得其反。