summaryrefslogtreecommitdiffstats
path: root/libcxx/src/memory.cpp
diff options
context:
space:
mode:
authorHoward Hinnant <hhinnant@apple.com>2010-11-16 21:33:17 +0000
committerHoward Hinnant <hhinnant@apple.com>2010-11-16 21:33:17 +0000
commit9b35c8275c6e25442915a25648a1b0bade40a43e (patch)
tree5e1d9d88a2243659212c104664332954b4e94f71 /libcxx/src/memory.cpp
parentfced6e2587dd530b5e35bd48eb67bc0097508a92 (diff)
downloadbcm5719-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.cpp11
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
OpenPOWER on IntegriCloud