From a922c5ff6f3872fc9ce1e484a0e92f288ff6c68d Mon Sep 17 00:00:00 2001 From: Jonathan Wakely Date: Fri, 23 Sep 2016 18:25:23 +0100 Subject: [PATCH] Optimize truncating a basic_string * include/bits/basic_string.h [_GLIBCXX_USE_CXX11_ABI] (basic_string::erase(size_type, size_type)): Add fast path for truncating the string, by calling _M_set_length directly. (basic_string::erase(__const_iterator, __const_iterator)): Likewise. * include/bits/basic_string.tcc [_GLIBCXX_USE_CXX11_ABI] (basic_string::resize(size_type, _CharT)): Likewise. From-SVN: r240446 --- libstdc++-v3/ChangeLog | 9 +++++++++ libstdc++-v3/include/bits/basic_string.h | 12 +++++++++--- libstdc++-v3/include/bits/basic_string.tcc | 2 +- 3 files changed, 19 insertions(+), 4 deletions(-) diff --git a/libstdc++-v3/ChangeLog b/libstdc++-v3/ChangeLog index 69338c13ace..80bc018c9bb 100644 --- a/libstdc++-v3/ChangeLog +++ b/libstdc++-v3/ChangeLog @@ -1,3 +1,12 @@ +2016-09-23 Jonathan Wakely + + * include/bits/basic_string.h [_GLIBCXX_USE_CXX11_ABI] + (basic_string::erase(size_type, size_type)): Add fast path for + truncating the string, by calling _M_set_length directly. + (basic_string::erase(__const_iterator, __const_iterator)): Likewise. + * include/bits/basic_string.tcc [_GLIBCXX_USE_CXX11_ABI] + (basic_string::resize(size_type, _CharT)): Likewise. + 2016-09-22 Jason Merrill * configure.ac: Define HAVE_MEMALIGN for newlib. diff --git a/libstdc++-v3/include/bits/basic_string.h b/libstdc++-v3/include/bits/basic_string.h index e823f132d4e..2708cbc60b7 100644 --- a/libstdc++-v3/include/bits/basic_string.h +++ b/libstdc++-v3/include/bits/basic_string.h @@ -1709,8 +1709,11 @@ _GLIBCXX_BEGIN_NAMESPACE_CXX11 basic_string& erase(size_type __pos = 0, size_type __n = npos) { - this->_M_erase(_M_check(__pos, "basic_string::erase"), - _M_limit(__pos, __n)); + _M_check(__pos, "basic_string::erase"); + if (__n == npos) + this->_M_set_length(__pos); + else if (__n != 0) + this->_M_erase(__pos, _M_limit(__pos, __n)); return *this; } @@ -1747,7 +1750,10 @@ _GLIBCXX_BEGIN_NAMESPACE_CXX11 _GLIBCXX_DEBUG_PEDASSERT(__first >= begin() && __first <= __last && __last <= end()); const size_type __pos = __first - begin(); - this->_M_erase(__pos, __last - __first); + if (__last == end()) + this->_M_set_length(__pos); + else + this->_M_erase(__pos, __last - __first); return iterator(this->_M_data() + __pos); } diff --git a/libstdc++-v3/include/bits/basic_string.tcc b/libstdc++-v3/include/bits/basic_string.tcc index 0080d2b0e2f..df1e8ddec75 100644 --- a/libstdc++-v3/include/bits/basic_string.tcc +++ b/libstdc++-v3/include/bits/basic_string.tcc @@ -351,7 +351,7 @@ _GLIBCXX_BEGIN_NAMESPACE_VERSION if (__size < __n) this->append(__n - __size, __c); else if (__n < __size) - this->_M_erase(__n, __size - __n); + this->_M_set_length(__n); } template -- 2.30.2