编辑:它不是重复的,因为这个问题询问编译器在O0中的决定。
据说here名称返回值优化(NRVO)是许多编译器支持的优化。但它是必须的还是只是一个很好的优化?
我的情况是,我想用-O0
进行编译(即没有优化),以方便调试,但我也希望为返回对象的返回语句(例如,向量)启用NRVO。如果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,但我希望代码与编译器无关。
答案 0 :(得分:6)
您应该更喜欢
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,在最坏的情况下,两者都会移动构造。