aboutsummaryrefslogtreecommitdiff
path: root/compile
diff options
context:
space:
mode:
authorJonathan Wakely <jwakely@redhat.com>2018-10-25 16:42:01 +0000
committerJonathan Wakely <jwakely@redhat.com>2018-10-25 16:42:01 +0000
commitf1d74281073a1e7d83cfeb97ee05a74583b08b59 (patch)
tree4acd0a9e3ce46d04034df967ac9d03c7ded3c46b /compile
parentf2026548b54e8236bc3a6ff9e7539d937e7ac7f9 (diff)
PR libstdc++/87749 fix (and optimize) string move construction
The move constructor for the SSO string uses assign(const basic_string&) when either: (1) the source string is "local" and so the contents of the small string buffer need to be copied, or (2) the allocator does not propagate and is_always_equal is false. Case (1) is suboptimal, because the assign member is not noexcept and the compiler isn't smart enough to see it won't actually throw in this case. This causes extra code in the move assignment operator so that any exception will be turned into a call to std::terminate. This can be fixed by copying small strings inline instead of calling assign. Case (2) is a bug, because the specific instances of the allocators could be equal even if is_always_equal is false. This can result in an unnecessary deep copy (and potentially-throwing allocation) when the storage should be moved. This can be fixed by simply checking if the allocators are equal. PR libstdc++/87749 * include/bits/basic_string.h [_GLIBCXX_USE_CXX11_ABI] (basic_string::operator=(basic_string&&)): For short strings copy the buffer inline. Only fall back to using assign(const basic_string&) to do a deep copy when reallocation is needed. * testsuite/21_strings/basic_string/modifiers/assign/char/87749.cc: New test. * testsuite/21_strings/basic_string/modifiers/assign/char/ move_assign_optim.cc: New test. * testsuite/21_strings/basic_string/modifiers/assign/wchar_t/87749.cc: New test. * testsuite/21_strings/basic_string/modifiers/assign/wchar_t/ move_assign_optim.cc: New test. git-svn-id: https://gcc.gnu.org/svn/gcc/branches/gcc-6-branch@265500 138bc75d-0d04-0410-961f-82ee72b054a4
Diffstat (limited to 'compile')
0 files changed, 0 insertions, 0 deletions