为了账号安全,请及时绑定邮箱和手机立即绑定

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

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

C++
慕斯709654 2020-02-03 14:41:31
当一个函数接受shared_ptr(来自boost或C ++ 11 STL)时,是否要传递它:通过const参考: void foo(const shared_ptr<T>& p)或值:void foo(shared_ptr<T> p)?我更喜欢第一种方法,因为我怀疑它会更快。但这真的值得吗?还是有其他问题?请问您提供选择的理由,或者如果是这样的话,为什么您认为这没有关系。
查看完整描述

3 回答

?
HUWWW

TA贡献1874条经验 获得超12个赞

Scott,Andrei和Herb 在C ++和Beyond 2011的“ 任何问题”会议上都讨论并回答了这个问题。从4:34 开始观看性能和正确性。shared_ptr


不久,没有理由按值传递,除非目标是共享对象的所有权(例如,在不同的数据结构之间或在不同的线程之间)。


除非您可以按照上面链接的视频中Scott Meyers的说明进行移动优化,但这与您可以使用的C ++的实际版本有关。


在GoingNative 2012会议的“ 互动小组:任何问题!”中对该讨论进行了重大更新。值得一看,尤其是从22:50开始。


查看完整回答
反对 回复 2020-02-03
?
哈士奇WWW

TA贡献1799条经验 获得超6个赞

这是赫伯·萨特的


准则:除非您要使用或操纵智能指针本身,例如共享或转让所有权,否则不要将智能指针作为函数参数传递。


准则:表示函数将使用按值shared_ptr参数存储和共享堆对象的所有权。


准则:仅使用非常量shared_ptr&参数来修改shared_ptr。仅在不确定是否要复制并共享所有权时,才使用const shared_ptr&作为参数。否则,请改用widget *(或者,如果不能为null,则使用widget&)。


查看完整回答
反对 回复 2020-02-03
?
qq_花开花谢_0

TA贡献1835条经验 获得超7个赞

我跑到下面的代码,一旦与foo服用shared_ptr的const&,并再次foo取shared_ptr的值。


void foo(const std::shared_ptr<int>& p)

{

    static int x = 0;

    *p = ++x;

}


int main()

{

    auto p = std::make_shared<int>();

    auto start = clock();

    for (int i = 0; i < 10000000; ++i)

    {

        foo(p);

    }    

    std::cout << "Took " << clock() - start << " ms" << std::endl;

}

在我的Intel Core 2 Quad(2.4GHz)处理器上使用VS2015,x86版本构建


const shared_ptr&     - 10ms  

shared_ptr            - 281ms 

按值复制版本要慢一个数量级。

如果要从当前线程同步调用函数,请选择const&版本。


查看完整回答
反对 回复 2020-02-03
  • 3 回答
  • 0 关注
  • 1240 浏览

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信