返回向量<foo>或shared_ptr <vector <foo>&gt;?</vector <foo> </foo>

时间:2011-11-02 07:47:45

标签: c++ boost vector c++11 shared-ptr

在一个函数中,“返回”会更合适吗?

一个。 vector<Foo>

B中。 shared_ptr<vector<Foor>>

换句话说,哪个副本不那么沉重,你会做什么,为什么?

3 个答案:

答案 0 :(得分:6)

我认为返回shared_ptr<vector<T>>很少有用。如果有几个对象可以容纳他们可以操作的共享向量,我只会这样做。对我而言,这表明存在设计缺陷。一个更好的选择可能是通过const引用返回。这避免了(可能很昂贵的)复制操作,但不允许访问者更改向量。

如果您要返回本地std::vector,您也可以通过参数返回。

如果你真的想要返回shared_ptr<vector<T>>,请考虑shared_ptr<const vector<T>>是否可以完成这项工作(矢量可以被许多人检查,但只能由所有者操纵)。

然而,A通常比B贵,但返回值优化通常适用于此处。对于C ++ 11,std::vector有一个移动构造函数,可以保证返回本地std::vector不需要昂贵的复制操作。

请记住,不要过早地优化:)

答案 1 :(得分:2)

返回shared_ptr<vector<Foo>>保证不会发生额外的副本。

如果返回值优化(RVO)启动,或者如果使用来自C ++ 11的移动语义,则返回vector<Foo> 可能避免额外的副本。但是,如果避免复制很重要,我就不会使用它(即使你可以确保这些优化总是可用的),因为我认为使用return-a-copy语义而不是实际意味着不复制是一个好主意。

我可能会选择其中一种,但这取决于:

  • 将引用传递给vector<Foo>作为参数
  • 传递插入迭代器(例如back_inserter)而不是

答案 2 :(得分:0)

在C ++ 03中,首选:

  1. 如果提供对成员的访问权限,请通过const引用返回。
  2. 否则,如果返回本地,请使用out参数。
  3. 在C ++ 11中,首选:

    1. 如果提供对成员的访问权限,请通过const引用返回。
    2. 否则,如果返回本地,则按值返回,因为移动构造将 避免过多的副本。
    3. 您希望返回引用计数智能指针的情况是具有不相交生命周期的多个对象都将要访问该对象的位置。然而,这不是最常见的情况,但它确实经常发生。