[libcxx-commits] [libcxx] 703c26f - Optimize and fix basic_string move assignment operator. Reviewed as https://reviews.llvm.org/D68623. Thanks to mvels for the patch.

via libcxx-commits libcxx-commits at lists.llvm.org
Wed Nov 27 07:13:43 PST 2019


Author: marshall
Date: 2019-11-27T07:13:32-08:00
New Revision: 703c26f03be74daf6e483380e6b23029a3851081

URL: https://github.com/llvm/llvm-project/commit/703c26f03be74daf6e483380e6b23029a3851081
DIFF: https://github.com/llvm/llvm-project/commit/703c26f03be74daf6e483380e6b23029a3851081.diff

LOG: Optimize and fix basic_string move assignment operator. Reviewed as https://reviews.llvm.org/D68623. Thanks to mvels for the patch.

Added: 
    

Modified: 
    libcxx/include/string

Removed: 
    


################################################################################
diff  --git a/libcxx/include/string b/libcxx/include/string
index c16dbedc51c0..4e0b21135a7e 100644
--- a/libcxx/include/string
+++ b/libcxx/include/string
@@ -2289,10 +2289,20 @@ basic_string<_CharT, _Traits, _Allocator>::__move_assign(basic_string& __str, tr
     _NOEXCEPT_(is_nothrow_move_assignable<allocator_type>::value)
 #endif
 {
-    __clear_and_shrink();
-    __r_.first() = __str.__r_.first();
-    __move_assign_alloc(__str);
-    __str.__zero();
+  if (__is_long()) {
+    __alloc_traits::deallocate(__alloc(), __get_long_pointer(),
+                               __get_long_cap());
+#if _LIBCPP_STD_VER <= 14
+    if (!is_nothrow_move_assignable<allocator_type>::value) {
+      __set_short_size(0);
+      traits_type::assign(__get_short_pointer()[0], value_type());
+    }
+#endif
+  }
+  __move_assign_alloc(__str);
+  __r_.first() = __str.__r_.first();
+  __str.__set_short_size(0);
+  traits_type::assign(__str.__get_short_pointer()[0], value_type());
 }
 
 template <class _CharT, class _Traits, class _Allocator>


        


More information about the libcxx-commits mailing list