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

Lee*_*hai 1 c++ nrvo stdmove

编辑:它不是重复,因为这个问题询问编译器在O0中的决定.

据说这里是名称返回值优化(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
}
Run Code Online (Sandbox Code Playgroud)

在这下面?

std::vector<int> foo() {
    std::vector<int> v(100000,1);
    return v;    // copy or move?
}
Run Code Online (Sandbox Code Playgroud)

编辑:我使用的编译器是GCC6,但我希望代码与编译器无关.

Jar*_*d42 6

你应该更喜欢

std::vector<int> foo() {
    std::vector<int> v(100000,1);
    return v;    // move or NRVO
}
Run Code Online (Sandbox Code Playgroud)

过度

std::vector<int> foo() {
    std::vector<int> v(100000,1);
    return std::move(v);    // move
}
Run Code Online (Sandbox Code Playgroud)

第二个片段阻止了NRVO,在最坏的情况下,两个片段都会移动构造.

  • 在第一个片段中,您有移动构造函数或甚至更好的NRVO(在C++ 17 NRVO保证:-)).在第二个片段中,移动调用阻止了NRVO,所以你只有移动构造,这并不是那么糟糕,但我们在第一个片段中使用更短的代码更好或相等. (2认同)