libstdc++: Optimize operator+(string/char*, char*/string) equally

Until now operator+(char*, const string&) and operator+(const string&,
char*) had different performance characteristics. The former required a
single memory allocation and the latter required two. This patch makes
the performance equal.

libstdc++-v3/ChangeLog:

	* include/bits/basic_string.h (operator+(const string&, const char*)):
	Remove naive implementation.
	* include/bits/basic_string.tcc (operator+(const string&, const char*)):
	Add single-allocation implementation.

Signed-off-by: Will Hawkins <whh8b@obs.cr>
This commit is contained in:
Will Hawkins 2022-08-24 02:16:48 -04:00 committed by Jonathan Wakely
parent 02de9d26b1
commit 0b7c925499
2 changed files with 23 additions and 7 deletions

View file

@ -3521,14 +3521,9 @@ _GLIBCXX_END_NAMESPACE_CXX11
*/
template<typename _CharT, typename _Traits, typename _Alloc>
_GLIBCXX20_CONSTEXPR
inline basic_string<_CharT, _Traits, _Alloc>
basic_string<_CharT, _Traits, _Alloc>
operator+(const basic_string<_CharT, _Traits, _Alloc>& __lhs,
const _CharT* __rhs)
{
basic_string<_CharT, _Traits, _Alloc> __str(__lhs);
__str.append(__rhs);
return __str;
}
const _CharT* __rhs);
/**
* @brief Concatenate string and character.

View file

@ -640,6 +640,27 @@ _GLIBCXX_BEGIN_NAMESPACE_VERSION
return __str;
}
template<typename _CharT, typename _Traits, typename _Alloc>
_GLIBCXX20_CONSTEXPR
basic_string<_CharT, _Traits, _Alloc>
operator+(const basic_string<_CharT, _Traits, _Alloc>& __lhs,
const _CharT* __rhs)
{
__glibcxx_requires_string(__rhs);
typedef basic_string<_CharT, _Traits, _Alloc> __string_type;
typedef typename __string_type::size_type __size_type;
typedef typename __gnu_cxx::__alloc_traits<_Alloc>::template
rebind<_CharT>::other _Char_alloc_type;
typedef __gnu_cxx::__alloc_traits<_Char_alloc_type> _Alloc_traits;
const __size_type __len = _Traits::length(__rhs);
__string_type __str(_Alloc_traits::_S_select_on_copy(
__lhs.get_allocator()));
__str.reserve(__len + __lhs.size());
__str.append(__lhs);
__str.append(__rhs, __len);
return __str;
}
template<typename _CharT, typename _Traits, typename _Alloc>
_GLIBCXX_STRING_CONSTEXPR
typename basic_string<_CharT, _Traits, _Alloc>::size_type