Hi all, The attached simple patch speeds up push_back() nearly six times relative to stdcxx 4.1.3 and makes it more than twice faster that gcc's.
$ time ./push_back-stdcxx-patched 500000000 real 0m2.800s user 0m1.676s sys 0m1.084s $ time ./push_back-stdcxx-4.1.3 500000000 real 0m11.206s user 0m10.017s sys 0m1.184s $ time ./push_back-gcc 500000000 real 0m4.555s user 0m3.840s sys 0m0.716s --Mark
Index: /home/mbrown/stdcxx/include/string =================================================================== --- /home/mbrown/stdcxx/include/string (revision 558531) +++ /home/mbrown/stdcxx/include/string (working copy) @@ -340,9 +340,7 @@ } // lwg issue 7 - void push_back (value_type __c) { - append (size_type (1), __c); - } + void push_back (value_type); basic_string& assign (const basic_string &__str) { return *this = __str; @@ -1088,6 +1086,22 @@ template <class _CharT, class _Traits , class _Allocator> inline void basic_string<_CharT, _Traits, _Allocator>:: +push_back (value_type __c) +{ + const size_type __size = size () + 1; + + if ( capacity () < __size + || size_type (1) < size_type (_C_pref ()->_C_get_ref ())) + append (1, __c); + else { + traits_type::assign (_C_data [size ()], __c); + _C_pref ()->_C_size._C_size = __size; + } +} + + +template <class _CharT, class _Traits , class _Allocator> +inline void basic_string<_CharT, _Traits, _Allocator>:: reserve (size_type __cap) { _RWSTD_REQUIRES (__cap <= max_size (),