52 lines
1.6 KiB
Diff
52 lines
1.6 KiB
Diff
|
the below is a (safe) backport from mainline and 3_4-branch: improves
|
||
|
2-3x the performance of operator>>(basic_istream<>&, basic_string<>&),
|
||
|
a rather common facility. Tested x86-linux, make check/check-abi.
|
||
|
|
||
|
Paolo.
|
||
|
|
||
|
///////////////
|
||
|
|
||
|
[ Part 2: "Attached Text" ]
|
||
|
|
||
|
2004-06-22 Paolo Carlini <pcarlini@suse.de>
|
||
|
|
||
|
* include/bits/istream.tcc (operator>>(basic_istream<>&,
|
||
|
basic_string<>&)): Use a temporary buffer, thus avoiding
|
||
|
reallocation for common case.
|
||
|
|
||
|
[ Part 3: "Attached Text" ]
|
||
|
|
||
|
diff -urN libstdc++-v3-orig/include/bits/istream.tcc libstdc++-v3/include/bits/istream.tcc
|
||
|
--- libstdc++-v3-orig/include/bits/istream.tcc 2004-05-02 18:10:34.000000000 +0200
|
||
|
+++ libstdc++-v3/include/bits/istream.tcc 2004-06-22 14:22:07.000000000 +0200
|
||
|
@@ -1038,7 +1038,10 @@
|
||
|
{
|
||
|
try
|
||
|
{
|
||
|
+ // Avoid reallocation for common case.
|
||
|
__str.erase();
|
||
|
+ _CharT __buf[128];
|
||
|
+ __size_type __len = 0;
|
||
|
streamsize __w = __in.width();
|
||
|
__size_type __n;
|
||
|
__n = __w > 0 ? static_cast<__size_type>(__w) : __str.max_size();
|
||
|
@@ -1052,10 +1055,17 @@
|
||
|
&& !_Traits::eq_int_type(__c, __eof)
|
||
|
&& !__ct.is(ctype_base::space, _Traits::to_char_type(__c)))
|
||
|
{
|
||
|
- __str += _Traits::to_char_type(__c);
|
||
|
+ if (__len == sizeof(__buf) / sizeof(_CharT))
|
||
|
+ {
|
||
|
+ __str.append(__buf, sizeof(__buf) / sizeof(_CharT));
|
||
|
+ __len = 0;
|
||
|
+ }
|
||
|
+ __buf[__len++] = _Traits::to_char_type(__c);
|
||
|
++__extracted;
|
||
|
__c = __sb->snextc();
|
||
|
}
|
||
|
+ __str.append(__buf, __len);
|
||
|
+
|
||
|
if (_Traits::eq_int_type(__c, __eof))
|
||
|
__err |= ios_base::eofbit;
|
||
|
__in.width(0);
|