[PATCH] D41976: Low-hanging fruit optimization in string::__move_assign().

Timothy VanSlyke via Phabricator via cfe-commits cfe-commits at lists.llvm.org
Fri Jan 12 12:37:39 PST 2018


tvanslyke updated this revision to Diff 129685.
tvanslyke added a comment.

I went ahead and just pulled it out to a small inline member function and added it to __copy_assign_alloc().  Removed some other redundancies.


https://reviews.llvm.org/D41976

Files:
  string


Index: string
===================================================================
--- string
+++ string
@@ -1407,24 +1407,30 @@
                       __alloc_traits::propagate_on_container_copy_assignment::value>());}
 
     _LIBCPP_INLINE_VISIBILITY
+    void __clear_and_shrink() 
+        {
+            clear();
+            if(__is_long())
+                __alloc_traits::deallocate(__alloc(), __get_long_pointer(), capacity() + 1);
+        } 
+
+    _LIBCPP_INLINE_VISIBILITY
     void __copy_assign_alloc(const basic_string& __str, true_type)
         {
             if (__alloc() == __str.__alloc())
                 __alloc() = __str.__alloc();
             else
             {
                 if (!__str.__is_long())
                 {
-                    clear();
-                    shrink_to_fit();
+                    __clear_and_shrink();
                     __alloc() = __str.__alloc();
                 }
                 else
                 {
                     allocator_type __a = __str.__alloc();
                     pointer __p = __alloc_traits::allocate(__a, __str.__get_long_cap());
-                    clear();
-                    shrink_to_fit();
+                    __clear_and_shrink();
                     __alloc() = _VSTD::move(__a);
                     __set_long_pointer(__p);
                     __set_long_cap(__str.__get_long_cap());
@@ -2102,8 +2108,7 @@
     _NOEXCEPT_(is_nothrow_move_assignable<allocator_type>::value)
 #endif
 {
-    clear();
-    shrink_to_fit();
+    __clear_and_shrink();
     __r_.first() = __str.__r_.first();
     __move_assign_alloc(__str);
     __str.__zero();


-------------- next part --------------
A non-text attachment was scrubbed...
Name: D41976.129685.patch
Type: text/x-patch
Size: 1646 bytes
Desc: not available
URL: <http://lists.llvm.org/pipermail/cfe-commits/attachments/20180112/de8144c1/attachment.bin>


More information about the cfe-commits mailing list