Преглед изворни кода

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';
}


git-svn-id: https://llvm.org/svn/llvm-project/libcxx/trunk@119388 91177308-0d34-0410-b5e6-96231b3b80d8

Howard Hinnant пре 14 година
родитељ
комит
28dbbe0596
2 измењених фајлова са 8 додато и 5 уклоњено
  1. 1 1
      include/memory
  2. 7 4
      src/memory.cpp

+ 1 - 1
include/memory

@@ -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;}
 };

+ 7 - 4
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