c++ 返回vector< Foo>还是shared_ptr〈vector< Foo>>?

relj7zay  于 2023-05-02  发布在  其他
关注(0)|答案(3)|浏览(154)

在函数中,哪一个“返回”更合适?
A. vector<Foo>
B. shared_ptr<vector<Foor>>
换句话说,哪一个副本不那么重,你会怎么做,为什么?

wwtsj6pe

wwtsj6pe1#

我认为返回shared_ptr<vector<T>>很少有用。我只会这样做,如果几个对象,其中持有一个共享的向量,他们可以操纵。对我来说,这表明了一个设计缺陷。一个更好的选择可能是通过const引用返回。这避免了(潜在的昂贵的)复制操作,但是不允许访问器改变向量。
如果你返回一个本地的std::vector,你也可以通过参数返回它。
如果您真的想返回shared_ptr<vector<T>>,请考虑shared_ptr<const vector<T>>是否可以完成这项工作(向量可以被许多人检查,但只能由所有者操作)。
然而,A通常比B更昂贵,但返回值优化通常适用于这里。对于C++11,std::vector有一个移动构造函数,它将保证返回一个本地std::vector不需要昂贵的复制操作。
记住,不要过早优化:)

deikduxw

deikduxw2#

返回shared_ptr<vector<Foo>>保证不会发生额外的复制。
返回vector<Foo> * 可以 * 避免额外的复制,如果返回值优化(RVO)启动,或者如果使用C++11的移动语义。但是如果避免复制很重要,我不会使用这个(即使你可以确保这些优化总是可用的),因为我不认为使用return-a-copy语义而实际上意味着不复制是一个好主意。
我可能会选择其中一个,但这取决于:

  • 传递对vector<Foo>的引用作为参数
  • 传递插入迭代器(e.例如back_inserter
xoefb8l8

xoefb8l83#

在C03中,首选:
1.如果提供对成员的访问,则通过常量引用返回。
1.否则,如果返回一个局部变量,则使用out引用参数。
在C
11中,首选:
1.如果提供对成员的访问,则通过常量引用返回。
1.否则,如果返回一个本地值,则通过值返回,因为移动构造将避免过多的副本。
您希望返回引用计数智能指针的情况是,具有不相交生存期的多个对象都希望访问该对象。这不是最常见的情况,但它经常发生。

相关问题