[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