-
- Downloads
libstdc++: Define std::string::resize_and_overwrite for C++11 and COW string
There are several places in the library where we can improve performance using resize_and_overwrite so it's inconvenient only being able to use it in C++23 mode, and only for cxx11 strings. This adds it for COW strings, and also adds __resize_and_overwrite as an extension for C++11 mode. The new __resize_and_overwrite is available for C++11 and later, so within the library we can use that consistently even in C++23. In order to avoid making a copy (which might not be possible for non-copyable, non-movable types) the callable is passed to resize_and_overwrite as an lvalue reference. Unlike wrapping it in std::ref(op) this ensures that invoking it as std::move(op)(n, p) will use the correct value category. It also avoids any overhead that would be added by wrapping it in a lambda like [&op](auto p, auto n) { return std::move(op)(p, n); }. Adjust std::format to use the new __resize_and_overwrite, which we can assume exists because we only use std::basic_string<char> and std::basic_string<wchar_t>, so no program-defined specializations. The uses in <experimental/internet> cannot be replaced, because those are type-dependent on an Allocator template parameter, which could mean they use program-defined specializations of std::basic_string that don't have the __resize_and_overwrite extension. libstdc++-v3/ChangeLog: * include/bits/basic_string.h (__resize_and_overwrite): New function. * include/bits/basic_string.tcc (__resize_and_overwrite): New function. (resize_and_overwrite): Simplify by using reserve instead of growing the string manually. Adjust for C++11 compatibility. * include/bits/cow_string.h (resize_and_overwrite): New function. (__resize_and_overwrite): New function. * include/bits/version.def (__cpp_lib_string_resize_and_overwrite): Do not depend on cxx11abi. * include/bits/version.h: Regenerate. * include/std/format (__formatter_fp::_S_resize_and_overwrite): Remove. (__formatter_fp::format, __formatter_fp::_M_localize): Use __resize_and_overwrite instead of _S_resize_and_overwrite. * testsuite/21_strings/basic_string/capacity/char/resize_and_overwrite.cc: Adjust for C++11 compatibility when included by ... * testsuite/21_strings/basic_string/capacity/char/resize_and_overwrite_ext.cc: New test.
Showing
- libstdc++-v3/include/bits/basic_string.h 7 additions, 0 deletionslibstdc++-v3/include/bits/basic_string.h
- libstdc++-v3/include/bits/basic_string.tcc 28 additions, 20 deletionslibstdc++-v3/include/bits/basic_string.tcc
- libstdc++-v3/include/bits/cow_string.h 90 additions, 0 deletionslibstdc++-v3/include/bits/cow_string.h
- libstdc++-v3/include/bits/version.def 0 additions, 1 deletionlibstdc++-v3/include/bits/version.def
- libstdc++-v3/include/bits/version.h 1 addition, 1 deletionlibstdc++-v3/include/bits/version.h
- libstdc++-v3/include/std/format 3 additions, 15 deletionslibstdc++-v3/include/std/format
- libstdc++-v3/testsuite/21_strings/basic_string/capacity/char/resize_and_overwrite.cc 79 additions, 22 deletions...trings/basic_string/capacity/char/resize_and_overwrite.cc
- libstdc++-v3/testsuite/21_strings/basic_string/capacity/char/resize_and_overwrite_ext.cc 6 additions, 0 deletions...gs/basic_string/capacity/char/resize_and_overwrite_ext.cc
Loading
Please register or sign in to comment