2

编辑:它不是重复的,因为这个问题询问编译器在 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
}

在下面这个?

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

编辑:我使用的编译器是 GCC6,但我希望代码独立于编译器。

4

1 回答 1

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

于 2017-08-14T18:50:01.917 回答