【问题标题】:C++: RVO, NRVO and returning local objectsC++:RVO、NRVO 和返回本地对象
【发布时间】:2014-12-31 07:32:08
【问题描述】:

我刚刚阅读了 RVO(返回值优化)和 NRVO(命名返回值优化)。下面是两个例子

//Example of RVO
Bar Foo()
{
    return Bar();
}

//Example of NVRO
Bar Foo()
{
    Bar bar;
    return bar;
}

这是有道理的,一个不错的编译器优化。但是,我从 Stanley Lippman 的“C++ 入门”中读到“从不返回指向本地对象的引用或指针”(第 6.3.2 章),示例代码是

//disaster: this function returns a reference to a local object
const string &manip()
{
    string ret;
    // transform ret in some way
    if (!ret.empty())
        return ret;  // WRONG: returning a reference to a local object!
    else
        return "Empty"; // WRONG: "Empty" is a local temporary string
}

我不明白,这个示例与 RVO 示例有什么不同吗? 如果它们相同,我如何确保编译器会进行 RVO 优化,而不是由于调用堆栈展开而导致未定义的行为?

【问题讨论】:

  • 注意,RVO 和 NRVO 的标准术语是copy elision
  • @MattMcNabb 是的,我现在可以看到了。谢谢!

标签: c++ rvo nrvo


【解决方案1】:

它们是不同的。

Bar Foo();

按值返回,复制本地对象。

const string &manip();

按引用返回,返回一个本地对象本身,在函数返回的同时引用无效。

【讨论】:

    猜你喜欢
    • 2018-08-03
    • 1970-01-01
    • 2013-12-19
    • 1970-01-01
    • 1970-01-01
    • 2016-07-08
    • 2020-05-18
    • 1970-01-01
    • 2018-02-21
    相关资源
    最近更新 更多