Re: [PATCH v2 1/4] [gdb/cli] Skip string copy in source_cache::ensure

Tom de Vries
2023-10-16T07:40:29Z

On 10/13/23 18:34, Lancelot SIX wrote:
> Hi Tom,
>
> On Fri, Oct 13, 2023 at 02:19:50PM +0200, Tom de Vries wrote:
>> In function source_cache::ensure we have:
>> ...
>> std::ostringstream output;
>> ...
>> contents = output.str();
>> ...
>> The last line causes an unnecessary string copy.
>>
>> C++20 allows us to skip it, like this:
>> ...
>> contents = std::move (output).str();
>> ...
>
> Looking at cppreference[1], it suggests that this new C++ overload for
> str should be equivalent to
>
> content = std::move (*output.rbuf ()).str ();
>
> Should we use this construct instead regardless of C++'s version and
> avoid the #ifdef? That being said, I find the C++20 version easier to
> read, so it's up to you.
>

I've played around with this a bit, and found out that I can also use
"contents = std::move (output).str();" in c++11. So I've just dropped
the ifdef.

Thanks,
- Tom

> Best,
> Lancelot.
>
> [1] https://en.cppreference.com/w/cpp/io/basic_ostringstream/str
>
>>
>> Use the more efficient version if compiling with -std=c++20.
>>
>> Tested on x86_64-linux.
>> ---
>> gdb/source-cache.c | 4 ++++
>> 1 file changed, 4 insertions(+)
>>
>> diff --git a/gdb/source-cache.c b/gdb/source-cache.c
>> index 77b357cb42b..7ef54411c69 100644
>> --- a/gdb/source-cache.c
>> +++ b/gdb/source-cache.c
>> @@ -252,7 +252,11 @@ source_cache::ensure (struct symtab *s)
>> std::istringstream input (contents);
>> std::ostringstream output;
>> highlighter->highlight (input, output, lang_name, fullname);
>> +#if __cplusplus >= 202002L
>> + contents = std::move (output).str();
>> +#else
>> contents = output.str ();
>> +#endif
>> already_styled = true;
>> }
>> catch (...)
>> --
>> 2.35.3
>>