You sometimes want to add a string to an existing data structure. For example, the C++17 template ‘std::optional’ may be used to represent a possible string value. You may copy it there, as this code would often do…
myoption = mystring;
Or you can move it:
myoption = std::move(mystring);
In C++, when ‘moving’ a value, the compiler does not need to create a whole new copy of the string. So it is often cheaper.
I wrote a little benchmark to assess the performance difference. It is a single test, but it should illustrate.
Firstly, for relatively long strings (a phrase or a sentence), the move is 5 times to 20 times faster.
|Apple LLVM 14, M2 processor||24 ns/string||1.2 ns/string|
|GCC 11, Intel Ice Lake||19 ns/string||4 ns/string|
Secondly, for short strings (a single word), the move is 1.5 times to 3 times faster but the absolute difference is small (as small as a fraction of a nanosecond). Your main concern should be with long strings.
|Apple LLVM 14, M2 processor||2.0 ns/string||1.2 ns/string|
|GCC 11, Intel Ice Lake||7 ns/string||2.6 ns/string|
My results illustrate that moving your sizeable data structure instead of copying them is beneficial.
But that’s not the fastest approach: the fastest approach is to just hold a pointer. Copying an address is unbeatably fast. A slightly less optimal approach is to use a lightweight object like an std::string_view: copying or creating an std::string_view is cheaper than doing the same with a C++ string.