首页
学习
活动
专区
工具
TVP
发布
社区首页 >问答首页 >通过shared_ptr传递的消耗是多少?

通过shared_ptr传递的消耗是多少?
EN

Stack Overflow用户
提问于 2018-05-14 09:51:29
回答 2查看 0关注 0票数 0

在整个应用程序中广泛使用std :: tr1 :: shared_ptr。包括作为函数参数传递对象。考虑以下:

代码语言:javascript
复制
class Dataset {...}

void f( shared_ptr< Dataset const > pds ) {...}
void g( shared_ptr< Dataset const > pds ) {...}
...

虽然通过shared_ptr传递一个数据集对象保证了它在f和g中的存在,但这些函数可能被调用了数百万次,导致大量的shared_ptr对象被创建和销毁。以下是最近一次运行的平面gprof配置文件的一部分:

代码语言:javascript
复制
Each sample counts as 0.01 seconds.
  %   cumulative   self              self     total
 time   seconds   seconds    calls   s/call   s/call  name
  9.74    295.39    35.12 2451177304     0.00     0.00  std::tr1::__shared_count::__shared_count(std::tr1::__shared_count const&)
  8.03    324.34    28.95 2451252116     0.00     0.00  std::tr1::__shared_count::~__shared_count()

因此,约17%的运行时间用于使用shared_ptr对象的引用计数。这是正常的吗?

我的应用程序的很大一部分是单线程的,我正考虑重写一些函数

代码语言:javascript
复制
void f( const Dataset& ds ) {...}

并更换调用

代码语言:javascript
复制
shared_ptr< Dataset > pds( new Dataset(...) );
f( pds );

代码语言:javascript
复制
f( *pds );

在我知道的地方,当程序的流程在f()内时,对象不会被破坏。但在我改变一堆函数调用之前,我想知道通过shared_ptr传递的典型性能是什么。看起来像shared_ptr不应该用于经常被调用的函数。

EN

回答 2

Stack Overflow用户

发布于 2018-05-14 18:10:39

总是传递shared_ptrconst引用:

代码语言:javascript
复制
void f(const shared_ptr<Dataset const>& pds) {...} 
void g(const shared_ptr<Dataset const>& pds) {...} 

关于他人提到的安全问题:

  • shared_ptr在整个应用程序中大量使用时,传递值将占用大量时间(我已经看到它超过50 +%)。
  • 当参数不应为空,使用const T&而不是const shared_ptr<T const>&
  • 使用const shared_ptr<T const>&const T*性能成问题更安全。
票数 0
EN

Stack Overflow用户

发布于 2018-05-14 19:40:57

只需要shared_ptr将其传递给保留以备将来使用的函数/对象。例如某些类可能会保留shared_ptr以便在工作线程中使用。对于简单的同步调用使用普通指针或引用就足够了。shared_ptr不应该使用纯指针完全替换。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/-100008466

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档