tvanslyke created this revision.
tvanslyke added a reviewer: howard.hinnant.
Herald added a subscriber: cfe-commits.
shrink_to_fit() ends up doing a lot work to get information that we already
know since we just called clear(). This change seems concise enough to be
worth the couple extra lines and my benchmarks show that it is indeed a pretty
decent win. It looks like the same thing is going on twice in
__copy_assign_alloc(), but I didn't want to go overboard since this is my first
contribution to llvm/libc++. Go easy on me!
Repository:
rCXX libc++
https://reviews.llvm.org/D41976
Files:
string
Index: string
===================================================================
--- string
+++ string
@@ -2103,7 +2103,15 @@
#endif
{
clear();
- shrink_to_fit();
+
+ size_type __cap = capacity();
+ // check if we need to deallocate anything
+ if(__recommend(0) != __cap)
+ {
+ pointer __old_data = __get_long_pointer();
+ __alloc_traits::deallocate(__alloc(), __old_data, __cap + 1);
+ __set_short_size(0);
+ }
__r_.first() = __str.__r_.first();
__move_assign_alloc(__str);
__str.__zero();
Index: string
===================================================================
--- string
+++ string
@@ -2103,7 +2103,15 @@
#endif
{
clear();
- shrink_to_fit();
+
+ size_type __cap = capacity();
+ // check if we need to deallocate anything
+ if(__recommend(0) != __cap)
+ {
+ pointer __old_data = __get_long_pointer();
+ __alloc_traits::deallocate(__alloc(), __old_data, __cap + 1);
+ __set_short_size(0);
+ }
__r_.first() = __str.__r_.first();
__move_assign_alloc(__str);
__str.__zero();
_______________________________________________
cfe-commits mailing list
[email protected]
http://lists.llvm.org/cgi-bin/mailman/listinfo/cfe-commits