C ++:我应该在return语句中明确使用std :: move()来强制移动吗?

时间:2017-08-14 18:37:43

标签: c++ nrvo stdmove

编辑:它不是重复的,因为这个问题询问编译器在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,但我希望代码与编译器无关。

1 个答案:

答案 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,在最坏的情况下,两者都会移动构造。