给出以下代码
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()
答案 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。如果是,则该对象将留下无效成员。