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

Timothy VanSlyke via Phabricator via cfe-commits cfe-commits at lists.llvm.org
Tue Jan 16 08:56:29 PST 2018


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

Implemented changes to ensure string state is valid after calling `__clear_and_shrink()`.  Benchmark results are identical.


https://reviews.llvm.org/D41976

Files:
  string


Index: string
===================================================================
--- string
+++ string
@@ -1407,24 +1407,34 @@
                       __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);
+                __set_long_cap(0);
+                __set_short_size(0);
+            }
+        } 
+
+    _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 +2112,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.129969.patch
Type: text/x-patch
Size: 1750 bytes
Desc: not available
URL: <http://lists.llvm.org/pipermail/cfe-commits/attachments/20180116/d053127e/attachment-0001.bin>


More information about the cfe-commits mailing list