C++:我应该在 return 语句中显式使用 std::move() 来强制移动吗?
C++: should I explicitly use std::move() in a return statement to force a move?
编辑:它不是重复的,因为这个问题询问的是编译器在 O0 中的决定。
据说 here 名称 Return 值优化 (NRVO) 是许多编译器支持的优化。但它是必须的还是只是一个可有可无的优化?
我的情况是,为了方便调试,我想用-O0
编译(即不优化),但我也希望为return语句启用NRVO return 对象(比如,一个向量)。如果 NRVO 不是必须的,编译器可能不会在 -O0
模式下执行它。在这种情况下,我应该更喜欢这个代码:
std::vector<int> foo() {
std::vector<int> v(100000,1); // an object that is really big..
return std::move(v); // explicitly move
}
下面这个?
std::vector<int> foo() {
std::vector<int> v(100000,1);
return v; // copy or move?
}
编辑:我使用的编译器是 GCC6,但我希望代码独立于编译器。
你应该更喜欢
std::vector<int> foo() {
std::vector<int> v(100000,1);
return v; // move or NRVO
}
超过
std::vector<int> foo() {
std::vector<int> v(100000,1);
return std::move(v); // move
}
第二个片段阻止了 NRVO,在最坏的情况下,两者都会移动构造体。
编辑:它不是重复的,因为这个问题询问的是编译器在 O0 中的决定。
据说 here 名称 Return 值优化 (NRVO) 是许多编译器支持的优化。但它是必须的还是只是一个可有可无的优化?
我的情况是,为了方便调试,我想用-O0
编译(即不优化),但我也希望为return语句启用NRVO return 对象(比如,一个向量)。如果 NRVO 不是必须的,编译器可能不会在 -O0
模式下执行它。在这种情况下,我应该更喜欢这个代码:
std::vector<int> foo() {
std::vector<int> v(100000,1); // an object that is really big..
return std::move(v); // explicitly move
}
下面这个?
std::vector<int> foo() {
std::vector<int> v(100000,1);
return v; // copy or move?
}
编辑:我使用的编译器是 GCC6,但我希望代码独立于编译器。
你应该更喜欢
std::vector<int> foo() {
std::vector<int> v(100000,1);
return v; // move or NRVO
}
超过
std::vector<int> foo() {
std::vector<int> v(100000,1);
return std::move(v); // move
}
第二个片段阻止了 NRVO,在最坏的情况下,两者都会移动构造体。