在一个函数中,哪个"return"更加合适?
A.
B.
换句话说,哪个拷贝更轻量级,你会选择哪个,并解释原因?
A.
vector<Foo>
?B.
shared_ptr<vector<Foor>>
?换句话说,哪个拷贝更轻量级,你会选择哪个,并解释原因?
vector<Foo>
?shared_ptr<vector<Foor>>
?shared_ptr<vector<T>>
。只有当多个对象需要持有一个共享的可操作向量时才会这样做。对我来说,这表明设计存在缺陷。更好的选择可能是通过const引用返回。这避免了(潜在昂贵的)复制操作,但不允许访问器改变向量。std::vector
,您也可以通过参数返回它。shared_ptr<vector<T>>
,请考虑是否使用shared_ptr<const vector<T>>
可以胜任工作(向量可以被许多人检查,但仅由所有者操作)。std::vector
具有移动构造函数,将保证返回本地std::vector
不需要昂贵的复制操作。返回 shared_ptr<vector<Foo>>
可以确保不会发生额外的复制。
如果启用了返回值优化(RVO)或使用了C++11中的移动语义,返回 vector<Foo>
可能会避免额外的复制。但是,如果重要的是要避免复制,我不会使用这种方法(即使您可以确保这些优化将始终可用),因为我认为在实际上意味着不复制时使用返回副本语义并不是一个好主意。
我可能会选择以下其中一种,但这取决于情况:
vector<Foo>
的引用作为参数传递back_inserter
)vector
。 - hamstergenevector<Foo>
,那我不会把它作为参数传递。对于我所知的所有编译器来说,如果返回类型不能放在寄存器中,调用约定将帮助你实现:调用者分配空间并将指针传递给被调用者,然后被调用者使用一个真实的对象来初始化该内存(根据代码调用适当的构造函数)。效果是你可以得到一个更干净的接口,而成本完全相同。 - David Rodríguez - dribeas在C++03中,建议:
在C++11中,建议:
您希望返回引用计数智能指针的情况是多个具有不同生命周期的对象都想要访问该对象的情况。然而,这并不是最常见的情况,但它经常发生。
std::move
显式地请求它们时才会被调用。无论如何,使用复制省略都是更好的选择。 - Nicol Bolas
unique_ptr
呢?返回shared_ptr
意味着函数正在保留副本;而返回unique_ptr
则让每个人都知道所有权已完全转移。 - Nicol Bolas