编译器是否在返回成员变量的情况下执行返回值优化

Does the compiler perform return value optimisation in case of returning member variable?

本文关键字:情况下 执行 返回值 优化 变量 是否 返回 成员 编译器      更新时间:2023-10-16

给定以下代码

class foo
{
    private:
        boost::shared_ptr <std::deque<foo> > m_ptr;
    public:
        foo();
        boost::shared_ptr <std::deque<foo> > get_my_ptr()
        {
            return m_ptr;
        }
};

当我们像这样调用get_my_ptr()函数时

boost::shared_ptr <std::deque<foo> > ptr = get_my_ptr()

编译器调用复制构造函数来创建 ptr 对象还是可以执行 nrvo?我们这样称呼它有什么区别

const boost::shared_ptr <std::deque<foo> >& ptr = get_my_ptr()

使用 NRVO,如果return 语句的表达式是具有自动存储持续时间的本地非易失性对象的名称,它不是函数参数。该本地对象直接在存储中构造,否则函数的返回值将被复制到其中。成员变量不满足这些条件。仅当您创建了成员的本地副本时,我才有可能:

boost::shared_ptr<std::deque<foo>> get_my_ptr()
{
    auto p = m_ptr;
    return p;
}

在您的示例中,将调用复制 ctor,这将增加共享指针的引用计数器。如果将返回的对象绑定到 const 引用,也会发生同样的情况。

返回成员变量时,编译不得执行 RVO。如果是这样,则对象将留下无效成员。