在 returning 成员变量的情况下,编译器是否执行 return 值优化?
Does the compiler perform return value optimisation in case of returning member variable?
给定以下代码
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()
返回成员变量时,编译不得执行RVO。如果是这样,该对象将留下一个无效成员。
使用 NRVO,编译器可以省略复制和移动构造,如果
return 语句的表达式是具有自动存储持续时间的本地非易失性对象的名称,它不是函数参数。该本地对象直接在存储中构造,否则函数的 return 值将被复制到该存储中。
成员变量不满足这些条件。我只有在您创建成员的本地副本时才有可能:
boost::shared_ptr<std::deque<foo>> get_my_ptr()
{
auto p = m_ptr;
return p;
}
在您的示例中,将调用复制构造函数,这将增加共享指针的引用计数器。如果将 returned 对象绑定到 const 引用,也会发生同样的情况。
给定以下代码
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()
返回成员变量时,编译不得执行RVO。如果是这样,该对象将留下一个无效成员。
使用 NRVO,编译器可以省略复制和移动构造,如果 return 语句的表达式是具有自动存储持续时间的本地非易失性对象的名称,它不是函数参数。该本地对象直接在存储中构造,否则函数的 return 值将被复制到该存储中。 成员变量不满足这些条件。我只有在您创建成员的本地副本时才有可能:
boost::shared_ptr<std::deque<foo>> get_my_ptr()
{
auto p = m_ptr;
return p;
}
在您的示例中,将调用复制构造函数,这将增加共享指针的引用计数器。如果将 returned 对象绑定到 const 引用,也会发生同样的情况。