diff options
author | Howard Hinnant <hhinnant@apple.com> | 2010-11-16 21:33:17 +0000 |
---|---|---|
committer | Howard Hinnant <hhinnant@apple.com> | 2010-11-16 21:33:17 +0000 |
commit | 9b35c8275c6e25442915a25648a1b0bade40a43e (patch) | |
tree | 5e1d9d88a2243659212c104664332954b4e94f71 /libcxx/src/memory.cpp | |
parent | fced6e2587dd530b5e35bd48eb67bc0097508a92 (diff) | |
download | bcm5719-llvm-9b35c8275c6e25442915a25648a1b0bade40a43e.tar.gz bcm5719-llvm-9b35c8275c6e25442915a25648a1b0bade40a43e.zip |
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
Diffstat (limited to 'libcxx/src/memory.cpp')
-rw-r--r-- | libcxx/src/memory.cpp | 11 |
1 files changed, 7 insertions, 4 deletions
diff --git a/libcxx/src/memory.cpp b/libcxx/src/memory.cpp index 9918531acc0..5bbf48e442c 100644 --- a/libcxx/src/memory.cpp +++ b/libcxx/src/memory.cpp @@ -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 |