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

时间:2016-02-10 06:54:44

标签: c++ reference copy-constructor temporary-objects

给出以下代码

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()

2 个答案:

答案 0 :(得分:3)

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

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

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

答案 1 :(得分:2)

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