Dave Zarzycki showed how the efficiency of shared_ptr could be significantly

increased.  The following program is running 49% faster:

#include <iostream>
#include <memory>
#include <chrono>
#include <vector>
#include "chrono_io"

int main()
{
    typedef std::chrono::high_resolution_clock Clock;
    Clock::time_point t0 = Clock::now();
    {
        std::shared_ptr<int> p(new int (1));
        std::vector<std::shared_ptr<int> > v(1000000, p);
        v.insert(v.begin(), p);
        v.insert(v.begin(), p);
        v.insert(v.begin(), p);
        v.insert(v.begin(), p);
    }
    Clock::time_point t1 = Clock::now();
    std::cout << (t1-t0) << '\n';
}

llvm-svn: 119388
This commit is contained in:
Howard Hinnant 2010-11-16 21:33:17 +00:00
parent fced6e2587
commit 9b35c8275c
2 changed files with 8 additions and 5 deletions

View File

@ -2535,7 +2535,7 @@ public:
: __shared_owners_(__refs) {}
void __add_shared();
void __release_shared();
bool __release_shared();
_LIBCPP_INLINE_VISIBILITY
long use_count() const {return __shared_owners_ + 1;}
};

View File

@ -50,11 +50,15 @@ __shared_count::__add_shared()
increment(__shared_owners_);
}
void
bool
__shared_count::__release_shared()
{
if (decrement(__shared_owners_) == -1)
{
__on_zero_shared();
return true;
}
return false;
}
__shared_weak_count::~__shared_weak_count()
@ -65,7 +69,6 @@ void
__shared_weak_count::__add_shared()
{
__shared_count::__add_shared();
__add_weak();
}
void
@ -77,8 +80,8 @@ __shared_weak_count::__add_weak()
void
__shared_weak_count::__release_shared()
{
__shared_count::__release_shared();
__release_weak();
if (__shared_count::__release_shared())
__release_weak();
}
void