猿问

我们应该按引用还是按值传递shared_ptr?

当一个函数接受shared_ptr(来自boost或C ++ 11 STL)时,是否要传递它:

  • 通过const参考: void foo(const shared_ptr<T>& p)

  • 或值:void foo(shared_ptr<T> p)

我更喜欢第一种方法,因为我怀疑它会更快。但这真的值得吗?还是有其他问题?

请问您提供选择的理由,或者如果是这样的话,为什么您认为这没有关系。


慕斯709654
浏览 1247回答 3
3回答

HUWWW

Scott,Andrei和Herb 在C ++和Beyond 2011的“ 任何问题”会议上都讨论并回答了这个问题。从4:34 开始观看性能和正确性。shared_ptr不久,没有理由按值传递,除非目标是共享对象的所有权(例如,在不同的数据结构之间或在不同的线程之间)。除非您可以按照上面链接的视频中Scott Meyers的说明进行移动优化,但这与您可以使用的C ++的实际版本有关。在GoingNative 2012会议的“ 互动小组:任何问题!”中对该讨论进行了重大更新。值得一看,尤其是从22:50开始。

哈士奇WWW

这是赫伯·萨特的准则:除非您要使用或操纵智能指针本身,例如共享或转让所有权,否则不要将智能指针作为函数参数传递。准则:表示函数将使用按值shared_ptr参数存储和共享堆对象的所有权。准则:仅使用非常量shared_ptr&参数来修改shared_ptr。仅在不确定是否要复制并共享所有权时,才使用const shared_ptr&作为参数。否则,请改用widget *(或者,如果不能为null,则使用widget&)。

qq_花开花谢_0

我跑到下面的代码,一旦与foo服用shared_ptr的const&,并再次foo取shared_ptr的值。void foo(const std::shared_ptr<int>& p){&nbsp; &nbsp; static int x = 0;&nbsp; &nbsp; *p = ++x;}int main(){&nbsp; &nbsp; auto p = std::make_shared<int>();&nbsp; &nbsp; auto start = clock();&nbsp; &nbsp; for (int i = 0; i < 10000000; ++i)&nbsp; &nbsp; {&nbsp; &nbsp; &nbsp; &nbsp; foo(p);&nbsp; &nbsp; }&nbsp; &nbsp;&nbsp;&nbsp; &nbsp; std::cout << "Took " << clock() - start << " ms" << std::endl;}在我的Intel Core 2 Quad(2.4GHz)处理器上使用VS2015,x86版本构建const shared_ptr&&nbsp; &nbsp; &nbsp;- 10ms&nbsp;&nbsp;shared_ptr&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; - 281ms&nbsp;按值复制版本要慢一个数量级。如果要从当前线程同步调用函数,请选择const&版本。
随时随地看视频慕课网APP
我要回答