当前位置: 代码迷 >> 综合 >> auto_ptr与shared_ptr --- shared_ptr (2)
  详细解决方案

auto_ptr与shared_ptr --- shared_ptr (2)

热度:47   发布时间:2023-12-16 19:42:22.0
Roger ( roger2yi@gmail.com)

auto_ptr与shared_ptr --- auto_ptr (1)

shared_ptr
shared_ptr是Boost库所提供的一个智能指针的实现,正如其名字所蕴意的一样:
 

An important goal of shared_ptr is to provide a standard shared-ownership pointer.

shared_ptr的一个重要目的就是为了提供一个标准的共享所有权的智能指针。
                                                        —— Boost库文档
 
没错,shared_ptr就是为了解决auto_ptr在对象所有权上的局限性(auto_ptr是独占的),在使用引用计数的机制上提供了可以共享所有权的智能指针,当然这不会没有任何额外的代价……
 
首先一个shared_ptr对象除了包括一个所拥有对象的指针(px)外,还必须包括一个引用计数代理对象( shared_count)的指针(pn)。而这个引用计数代理对象包括一个真正的多态的引用计数对象( sp_counted_base)的指针(_pi),真正的引用计数对象在使用VC编译器的情况下包括一个虚表,一个虚表指针,和两个计数器。
 
下图中result是一个shared_ptr对象,我们可以清楚看到它展开后所包含的数据:
 

 
假设我们有多个(5个以上)shared_ptr共享一个动态对象,那么每个shared_ptr的开销比起只使用原生指针的开销大概在3,4倍左右(这还是理想状况,忽略了动态分配带来的俑余开销)。如果只有一个shared_ptr独占动态对象,空间上开销更是高度十数倍!而auto_ptr的开销只是使用原生指针的两倍。
 
时间上的开销主要在初始化和拷贝操作上,*和->操作符重载的开销跟auto_ptr是一样的。
 
当然开销并不是我们不使用shared_ptr的理由,永远不要进行不成熟的优化,直到性能分析器告诉你这一点,这是Hurb提出的明智的建议。以上的说明只是为了让你了解强大的功能背后总是伴随着更多的开销,shared_ptr应该被使用,但是也不要过于滥用,特别是在一些auto_ptr更擅长的地方。
 
下面是shared_ptr的类型定义:
 
 template < class  T >   class  shared_ptr  {
 

    
public:
 

      typedef T element_type;
 

      shared_ptr(); 
// never throws

      template
<class Y> explicit shared_ptr(Y * p);

      template
<class Y, class D> shared_ptr(Y * p, D d);

      
~shared_ptr(); // never throws
 

      shared_ptr(shared_ptr 
const & r); // never throws

      template
<class Y> shared_ptr(shared_ptr<Y> const